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
相关产品推荐
相关产品推荐

