You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者گروه بارانک

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:43