Android HttpClient POST请求PHP服务器,JSON数据显示异常排查
你现在碰到的情况是,Android端明明发送的是包含email和name的JSON数据,但PHP服务器返回的Toast和页面都显示received: received: Array,根本看不到预期的内容对吧?咱们一步步拆解问题,找到解决办法:
问题根源分析
1. Android端的实际发送格式
你的getPostDataString方法并没有直接发送JSON字符串,而是把JSONObject转成了表单键值对格式(也就是name=MyName&email=myname@gmail.com这种application/x-www-form-urlencoded类型的数据)。所以服务器端收到的是两个独立的POST参数name和email,而不是一个叫params的参数。
2. PHP端的错误处理
你在PHP代码里写了$Data_received_from_array= $Data_array_received["params"];,但实际上Android端根本没传params这个参数,这行代码其实会触发未定义索引的错误(只是你没开启错误提示所以没看到)。另外,PHP里直接echo一个数组的话,会自动转换成字符串Array,这就是你看到received: Array的原因。
两种可行的修改方案
方案一:保持Android端的表单格式,修改PHP代码
既然Android端发的是标准表单数据,PHP直接读取$_POST里的字段即可,还可以把整个POST数组转成JSON输出,正好符合你想要的显示效果:
<?php header("Pragma: no-cache"); header("Cache-Control: no-cache"); header("Expires: 0"); // 将整个POST数组转为JSON格式输出 $receivedJson = json_encode($_POST); echo "received: " . $receivedJson; // 如果需要单独获取字段也可以这么写 // $name = $_POST['name'] ?? '未收到'; // $email = $_POST['email'] ?? '未收到'; // echo "name: {$name}, email: {$email}"; ?>
方案二:Android端直接发送JSON字符串,PHP读取原始请求体
如果你本来就想发送纯JSON格式的请求体,那需要调整Android端的代码,同时修改PHP的读取方式:
Android端修改部分
在doInBackground方法里,替换发送数据的代码,并添加请求头告诉服务器是JSON格式:
// 替换原来的writer.write(getPostDataString(postDataParams)); writer.write(postDataParams.toString()); // 添加请求头,指定内容类型为JSON conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
PHP端修改代码
此时$_POST无法直接获取JSON数据,需要读取原始请求体:
<?php header("Pragma: no-cache"); header("Cache-Control: no-cache"); header("Expires: 0"); // 读取原始POST请求体 $rawJson = file_get_contents('php://input'); echo "received: " . $rawJson; // 如果需要转成数组处理 // $data = json_decode($rawJson, true); // print_r($data); ?>
验证效果
不管用哪种方案修改后,点击按钮后Toast和服务器页面都会显示你预期的{"email":"abc@gmail.com","name":"abc"}(或者对应的格式化内容)。
内容的提问来源于stack exchange,提问作者Game Of Thrones SuperFan

