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

安卓调用JSON API返回无效请求错误,Postman正常,求排查代码问题

排查安卓API调用返回无效请求的问题

嘿,我看了你的代码,发现几个可能导致「无效请求」错误的关键点,结合Postman能正常工作的情况,咱们来一步步解决:

1. 请求格式不匹配(最可能的原因)

你在代码里用JsonObjectRequest把参数打包成JSONObject发送,这会让请求的Content-Type变成application/json。但很大概率你在Postman测试时,用的是**表单格式(x-www-form-urlencoded)**提交参数——很多API只接受这种表单格式的POST请求,不支持JSON payload,这就会导致服务器识别不了你的请求,返回无效请求错误。

2. 响应打印的小错误

你在onResponse方法里打印的是jsonObj.toString(),这是你自己发送的请求参数,不是服务器返回的真实响应。这会让你看不到服务器到底返回了什么,很难排查问题。


修正方案

情况一:API需要表单格式请求

把请求改成StringRequest,用表单参数提交,这和你在Postman里的操作一致:

String url = "http://apiaddress";
// POST 参数
Map<String, String> params = new HashMap<>();
params.put("tag", "test");

StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 打印服务器返回的真实响应
                System.out.println("服务器响应: " + response);
                // 如果需要把响应转成JSONObject,这里可以处理
                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    // 后续处理逻辑
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 打印错误细节,方便排查
                if (error.networkResponse != null) {
                    System.out.println("错误状态码: " + error.networkResponse.statusCode);
                    System.out.println("错误内容: " + new String(error.networkResponse.data));
                }
                error.printStackTrace();
            }
        }) {
    @Override
    protected Map<String, String> getParams() {
        return params;
    }
};

// 记得把请求加入Volley请求队列
RequestQueue queue = Volley.newRequestQueue(context);
queue.add(stringRequest);

情况二:API确实支持JSON格式

如果服务器明确接受JSON请求,那你需要检查这几点:

  • 确保请求头正确:Postman里可能加了必要的请求头(比如Content-Type、Authorization等),但代码里没加。可以给JsonObjectRequest添加请求头:
    jsonObjRequest.setHeaders(new HashMap<String, String>() {{
        put("Content-Type", "application/json");
        // 如果有token或其他认证头,在这里添加
    }});
    
  • 检查安卓端网络权限:确认AndroidManifest.xml里已经添加了网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 核对url是否完全正确,有没有拼写错误或者环境差异(比如Postman用的是内网地址,安卓设备没在同一网络)

内容的提问来源于stack exchange,提问作者adesh singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:33