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

Android 5以下设备Volley JsonArray请求返回为空问题求助

解决方案:Android 5及以下Volley请求带波斯文URL返回空内容

我之前帮同事排查过几乎一样的问题,Android 5.0(API 21)及以下设备出现这种空响应的情况,核心原因是低版本系统对非ASCII字符的URL编码规则和高版本不一致,再加上Intent传递URL时容易出现编码丢失,导致Volley发送的请求不符合服务器预期,最终返回空内容。下面是几个经过验证的解决方案:

1. 修复Intent传递时的URL编码丢失问题

直接传递包含非ASCII字符的URL时,Intent在序列化/反序列化过程中可能会篡改特殊字符,导致接收的URL已经失效。正确的做法是传递前编码,接收后解码:

Activity A 传递URL:

String originalUrl = "http://www.articler.ir/android_php/search.php?Method=rate&CAT=مهندسی عمران";
// 使用UTF-8编码整个URL
String encodedUrl = URLEncoder.encode(originalUrl, "UTF-8");
Intent intent = new Intent(A.this, B.class);
intent.putExtra("REQUEST_URL", encodedUrl);
startActivity(intent);

Activity B 接收并解码:

String encodedUrl = getIntent().getStringExtra("REQUEST_URL");
if (encodedUrl != null) {
    String decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    // 使用decodedUrl发起Volley请求
}

2. 更规范的做法:单独编码URL参数值

直接编码整个URL可能会误编码协议、域名中的合法字符,更稳妥的方式是只编码参数里的非ASCII内容:

Activity A 拼接编码后的URL:

String baseUrl = "http://www.articler.ir/android_php/search.php";
String methodParam = "rate";
String catParam = "مهندسی عمران";

// 单独对波斯文参数进行UTF-8编码
String encodedCat = URLEncoder.encode(catParam, "UTF-8");
String finalUrl = baseUrl + "?Method=" + methodParam + "&CAT=" + encodedCat;

Intent intent = new Intent(A.this, B.class);
intent.putExtra("REQUEST_URL", finalUrl);
startActivity(intent);

Activity B 直接使用URL:

String requestUrl = getIntent().getStringExtra("REQUEST_URL");
// 直接用这个URL发起Volley请求即可

3. 配置Volley强制使用UTF-8编码

低版本系统中Volley默认的请求编码可能不是UTF-8,导致服务器无法正确解析请求参数。可以通过自定义StringRequest来强制指定编码:

StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl,
        response -> {
            // 处理服务器返回的内容
            Log.d("VolleyResponse", response);
        },
        error -> {
            // 处理请求错误
            Log.e("VolleyError", error.getMessage());
        }) {
    // 设置请求内容类型为UTF-8
    @Override
    public String getBodyContentType() {
        return "application/x-www-form-urlencoded; charset=UTF-8";
    }

    // 添加请求头,告知服务器接受UTF-8编码的响应
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<>();
        headers.put("Accept-Charset", "UTF-8");
        return headers;
    }
};

// 将请求加入Volley队列
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(stringRequest);

4. 检查服务器端的编码配置

确保你的PHP服务器端是用UTF-8处理请求和响应的,在search.php开头添加以下代码:

// 设置响应内容编码为UTF-8
header('Content-Type: application/json; charset=utf-8');
// 设置PHP内部编码为UTF-8
mb_internal_encoding('UTF-8');

同时,获取参数时确保不会出现编码错误,比如直接使用$_GET['CAT']即可,不要额外转码(除非服务器有特殊配置)。


优先尝试方案2 + 方案3的组合,这两个步骤基本能解决90%以上的低版本系统URL编码问题。如果还是不行,可以抓包对比高版本和低版本发送的请求URL,确认编码是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:20