Android应用调用WordPress REST API返回错误数据问题排查
问题分析与解决方案
问题本质
你的Android应用请求WordPress REST API时,服务器返回的不是预期的JSON数组,而是Imunify360 WebShield的人机验证HTML页面,这直接导致JSON解析库报错——它期望解析数组,实际拿到的是HTML字符串,所以抛出java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING异常。
浏览器正常、Android异常的原因
- 浏览器端:自带完整JS执行环境,能自动运行验证页面内的脚本,提交隐藏表单完成验证;验证通过后服务器会设置Cookie,后续请求携带该Cookie即可获取正常JSON数据。
- Android应用端:默认请求头与浏览器差异较大,被Imunify360判定为可疑机器人流量;且无JS执行环境,无法自动完成验证流程,直接拿到验证页面的HTML内容。
解决办法
1. 模拟浏览器请求头
在Android请求中添加与浏览器一致的关键请求头,降低被拦截概率:
Request request = new Request.Builder() .url("https://www.mypantry.pl/wp-json/wp/v2/posts?categories=32") .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36") .addHeader("Accept", "application/json, text/plain, */*") .build();
2. 手动处理人机验证流程
若模拟UA仍被拦截,需手动处理验证逻辑:
- 检测响应的
Content-Type,若为text/html则解析HTML中的表单 - 计算脚本内
west + east的数值(实际为78357357) - 提交表单到指定action地址,获取服务器返回的验证Cookie
- 后续请求携带该Cookie,即可获取正常JSON数据
3. 联系网站管理员
直接联系该站点管理员,说明应用需要访问REST API,请求将应用的IP地址或自定义UA加入Imunify360白名单,这是最彻底的解决方案。
内容的提问来源于stack exchange,提问作者Mateusz Hermanowicz
相关产品推荐
相关产品推荐

