HttpURLConnectionとOutputStreamWriterで苦労しています。
有効なエラー応答が返されるので、コードは実際にサーバーに到達します。 POSTリクエストが送信されましたが、サーバー側でデータが受信されていません。
このことの適切な使用法へのヒントは高く評価されています。
コードは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;
}
_
送信しようとしているJSON:
_JSONObject request = {
"action":"login",
"user":"mogens",
"auth":"b96f704fbe702f5b11a31524bfe5f136efea8bf7",
"location":{
"accuracy":25,
"provider":"network",
"longitude":120.254944,
"latitude":14.847808
}
};
_
そして、私がサーバーから受け取る応答:
_JSONObject response = {
"success":false,
"response":"Unknown or Missing action.",
"request":null
};
_
そして、私が持っていたはずの応答:
_JSONObject response = {
"success":true,
"response":"Welcome Mogens Burapa",
"request":"login"
};
_
サーバーサイドPHPスクリプト:
_<?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;
?>
_
そして、logcatの出力は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}
_
_?action=login
_をURL
に追加すると、サーバーから成功応答を取得できます。ただし、actionパラメーターのみがサーバー側に登録されます。
_{"success":true,"message":"Welcome ","request":"login"}
_
結論は、URLConnection.write(output.getBytes("UTF-8"));
によってデータが転送されないということでなければなりません。
結局、データは転送されます。
@greenapsによって提供されるソリューションはトリックを行います:
_$json = file_get_contents('php://input');
$request = json_decode($json, true);
_
上記のPHPスクリプトは、解決策を示すために更新されました。
echo (file_get_contents('php://input'));
Jsonテキストが表示されます。次のように操作します。
$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString, true);
私はサーバーにそれが私から得たものを教えてもらいました。
リクエストヘッダーとPOST本文
<?php
$requestHeaders = Apache_request_headers();
print_r($requestHeaders);
print_r("\n -= POST Body =- \n");
echo file_get_contents( 'php://input' );
?>
チャームのように機能します)
outputStreamWriterの代わりにDataOutputStreamを使用してみてください。
DataOutputStream out = new DataOutputStream(_conn.getOutputStream());
out.writeBytes(your json serialized string);
out.close();
有効なエラー応答が返されるので、コードは実際にサーバーに到達します。 POSTリクエストが行われ、ただし、サーバー側でデータは受信されません。
これと同じ状況になり、@ greenappsの回答に来てください。 'postrequest'からどのサーバーが受信したかを知っておく必要があります
サーバー側で最初に行うこと:
_echo (file_get_contents('php://input'));
_
次に、クライアント側でメッセージ応答を印刷/トースト/表示します。次のように、正しい形式であることを確認してください。
_{"username": "yourusername", "password" : "yourpassword"}
_
このような応答の場合(yourHashMap.toString()
を使用してリクエストを投稿するため):
_{username=yourusername,password=yourpassword}
_
代わりに.toString()を使用し、代わりにこのメソッドを使用してHashMapをStringに変換します。
_private String getPostDataString(HashMap<String, String> postDataParams) {
StringBuilder result = new StringBuilder();
boolean first = true;
for (Map.Entry<String,String> entry : postDataParams.entrySet()){
if(first){
first = false;
}else{
result.append(",");
}
result.append("\"");
result.append(entry.getKey());
result.append("\":\"");
result.append(entry.getValue());
result.append("\"");
}
return "{" + result.toString() + "}";
}
_