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

Android中JsonObjectRequest调用本地API抛出空异常问题

解决Android Volley调用本地API空异常问题

你遇到的问题很典型——Postman能正常请求但Android端不行,而且在线API没问题,说明问题大概率出在Android针对本地HTTP请求的特殊限制或者请求解析的细节上,下面给你几个排查和解决的方向:

1. 解决Android 9+的明文HTTP限制

从Android 9(API级别28)开始,系统默认禁止应用使用明文HTTP请求(只能用HTTPS),你的本地API是http://开头的,所以会被拦截。解决方法是配置网络安全策略:

  • 在res/xml目录下创建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <!-- 允许你的本地API域名/IP的明文请求 -->
        <domain includeSubdomains="true">192.168.1.13</domain>
    </domain-config>
</network-security-config>
  • 然后在AndroidManifest.xml的application标签里添加引用:
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

2. 确认设备和API服务器在同一局域网

确保你的Android测试设备(真机或模拟器)和运行API的电脑连接的是同一个WiFi网络,而且192.168.1.13这个IP是电脑当前的局域网IP(可以在电脑上用ipconfig(Windows)或ifconfig(Linux/Mac)确认)。如果是模拟器的话,还可以试试把IP换成10.0.2.2(Android模拟器默认映射到主机的localhost)。

3. 检查请求类型和API是否匹配

确认Postman里用的请求方法是不是GET?如果你的API的getsale接口只支持POST请求,那你用Volley的GET请求肯定会失败。可以把请求改成POST试试:

JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, apiURL, null, 
    // 成功回调...
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            // 原解析逻辑
        }
    },
    // 失败回调...
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }
);

或者直接在Postman里切换成GET请求测试,看能不能正常返回结果。

4. 确认API返回的JSON格式是否匹配你的解析逻辑

你的代码里假设返回的是包含sales数组的JSONObject,但如果API直接返回的是JSON数组(比如[{"saletype":"xxx"},...]),那用JsonObjectRequest就会解析失败,抛出空异常。这种情况下应该换成JsonArrayRequest:

JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, apiURL, null,
    new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            try {
                for (int i=0;i<response.length();i++){
                    JSONObject employee = response.getJSONObject(i);
                    TableRow tbrow = new TableRow( MainActivity.this );
                    TextView t1v = new TextView(MainActivity.this);
                    t1v.setText(employee.getString("saletype"));
                    // ....
                    stk.addView(tbrow);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // 这里打印详细错误信息,方便排查
            error.printStackTrace();
        }
    }
);
mQueue.add(request);

额外调试技巧

在onErrorResponse里打印更详细的错误信息,比如:

@Override
public void onErrorResponse(VolleyError error) {
    error.printStackTrace();
    Log.e("VolleyDebug", "Error details: " + error.toString());
    if (error.networkResponse != null) {
        Log.e("VolleyDebug", "Status Code: " + error.networkResponse.statusCode);
        Log.e("VolleyDebug", "Response Data: " + new String(error.networkResponse.data));
    }
}

这样能看到具体的错误原因,比如是连接超时、404错误还是JSON解析失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:42:45