Ich habe Probleme mit HttpURLConnection und OutputStreamWriter. Der Code erreicht tatsächlich den Server, da ich einen gültigen Fehler Antwort zurück bekomme. Es wird eine POST-Anforderung gestellt, aber es werden keine Daten serverseitig empfangen.HttpURLConnection senden JSON POST-Anfrage an Apache/PHP
Alle Hinweise zur richtigen Verwendung dieses Dings werden sehr geschätzt.
Der Code ist in einem AsyncTask
protected JSONObject doInBackground(Void... params) {
try {
url = new URL(destination);
client = (HttpURLConnection) url.openConnection();
client.setDoOutput(true);
client.setDoInput(true);
client.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
client.setRequestMethod("POST");
//client.setFixedLengthStreamingMode(request.toString().getBytes("UTF-8").length);
client.connect();
Log.d("doInBackground(Request)", request.toString());
OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream());
String output = request.toString();
writer.write(output);
writer.flush();
writer.close();
InputStream input = client.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
Log.d("doInBackground(Resp)", result.toString());
response = new JSONObject(result.toString());
} catch (JSONException e){
this.e = e;
} catch (IOException e) {
this.e = e;
} finally {
client.disconnect();
}
return response;
}
Die JSON Ich versuche zu senden:
JSONObject request = {
"action":"login",
"user":"mogens",
"auth":"b96f704fbe702f5b11a31524bfe5f136efea8bf7",
"location":{
"accuracy":25,
"provider":"network",
"longitude":120.254944,
"latitude":14.847808
}
};
Und die Antwort, die ich von dem Server erhalten:
JSONObject response = {
"success":false,
"response":"Unknown or Missing action.",
"request":null
};
Und die Antwort, die ich hätte haben sollen:
JSONObject response = {
"success":true,
"response":"Welcome Mogens Burapa",
"request":"login"
};
Die serverseitige PHP-Skript:
<?php
$json = file_get_contents('php://input');
$request = json_decode($json, true);
error_log("JSON: $json");
error_log('DEBUG request.php: ' . implode(', ',$request));
error_log("============ JSON Array ===============");
foreach ($request as $key => $val) {
error_log("$key => $val");
}
switch($request['action'])
{
case "register":
break;
case "login":
$response = array(
'success' => true,
'message' => 'Welcome ' . $request['user'],
'request' => $request['action']
);
break;
case "location":
break;
case "nearby":
break;
default:
$response = array(
'success' => false,
'response' => 'Unknown or Missing action.',
'request' => $request['action']
);
break;
}
echo json_encode($response);
exit;
?>
Und die logcat Ausgabe in Android Studio:
D/doInBackground(Request)﹕ {"action":"login","location":{"accuracy":25,"provider":"network","longitude":120.254944,"latitude":14.847808},"user":"mogens","auth":"b96f704fbe702f5b11a31524bfe5f136efea8bf7"}
D/doInBackground(Resp)﹕ {"success":false,"response":"Unknown or Missing action.","request":null}
Wenn ich ?action=login
zum URL
anhängen kann ich einen Erfolg Antwort vom Server erhalten. Aber nur die Aktion Parameter registriert serverseitig.
{"success":true,"message":"Welcome ","request":"login"}
Die Schlussfolgerung muss sein, dass keine Daten von URLConnection.write(output.getBytes("UTF-8"));
übertragen
Nun, Daten schließlich übertragen bekommen.
Lösung von @greenaps angeboten funktioniert der Trick:
$json = file_get_contents('php://input');
$request = json_decode($json, true);
PHP-Skript über die Lösung aktualisiert, um anzuzeigen.
Zeigen Sie Ihre PHP-Skript bitte. – greenapps
'Die JSON, die ich senden möchte: request = {'. Nein. Anfrage, aber request.toString() sollte das sein. Was ist die Art von "Anfrage"? Unterlassen Sie Typen nicht. – greenapps
@greenapps Die PHP ist ziemlich einfach '$ request = $ _REQUEST; \t $ post = $ _POST; \t \t error_log ('DEBUG request.php:'. Implode (',', $ Anfrage)); \t error_log ("REQUEST ============ ==============="); \t while (Liste ($ key, $ val) = jeder ($ _ REQUEST)) { \t error_log ("$ key => $ val"); \t} ' –