gpt4 book ai didi

java - HttpURLConnection 向 Apache/PHP 发送 JSON POST 请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:06:37 25 4
gpt4 key购买 nike

我正在为 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;


?>

Android Studio 中的 logcat 输出:

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","re​​quest":"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);

关于java - HttpURLConnection 向 Apache/PHP 发送 JSON POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com