Android使用Volley与PHP服务器交互时JSONObject传值为空问题
问题分析与解决方案
你遇到的核心问题是:Volley的JsonObjectRequest发送的JSON数据,PHP端用$_POST['myjson']无法获取到,导致解析后$command为null。这是因为两者的请求数据格式不匹配——Volley默认发送的是原始JSON请求体,而PHP的$_POST只处理表单格式的键值对数据。
原因详解
Volley的JsonObjectRequest会把你传入的JSONObject以application/json的Content-Type发送到服务器,数据直接放在请求体里,而不是像普通表单那样封装成key=value的格式。这时候PHP的$_POST数组里不会有myjson这个键,自然解析出来的值就是null。
解决方案一:修改PHP端(推荐,符合RESTful规范)
直接读取原始请求体来获取JSON数据,这是处理application/json类型请求的标准方式:
<?php // 读取服务器接收到的原始请求体内容 $raw_post_data = file_get_contents('php://input'); // 解析JSON为关联数组 $post_data = json_decode($raw_post_data, true); // 检查解析是否成功,以及是否存在command字段 if ($post_data && isset($post_data['command'])) { $command = $post_data['command']; echo $command; // 现在会输出get_ad_list } else { // 处理解析失败或字段缺失的情况 echo json_encode(['error' => '无效的JSON数据或缺少command字段']); } ?>
解决方案二:修改Android端(适配现有PHP逻辑)
如果不想改动PHP代码,可以把JSON作为表单参数myjson的值发送,这时候需要用StringRequest来构造表单请求:
StringRequest request = new StringRequest(Request.Method.POST, getUrl(), new Response.Listener<String>() { @Override public void onResponse(String response) { Log.e("xxxxxxxxx-result ", response); // 如果需要将返回值转为JSONObject,可在此处理 try { JSONObject jsonResponse = new JSONObject(response); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("xxxxxxxxx-error ", error.toString()); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<>(); // 将JSON字符串作为myjson参数的值传入 params.put("myjson", "{\"command\":\"get_ad_list\"}"); return params; } }; request.setRetryPolicy(new DefaultRetryPolicy(8000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); RequestQueue requestQueue = Volley.newRequestQueue(context); requestQueue.add(request);
额外注意事项
- 优先选择方案一,因为
application/json是当前API开发的主流数据格式,更规范且扩展性更强。 - 调试时可以用Postman模拟请求:先发送一个
application/json类型的请求,确认PHP端能正确解析,再调试Android代码。 - Volley的
JsonObjectRequest默认已经设置了Content-Type: application/json,不需要额外重写getHeaders()方法(如果有特殊需求除外)。
内容的提问来源于stack exchange,提问作者گروه بارانک
相关产品推荐
相关产品推荐

