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

Android应用调用getJson()获取PHP返回JSON时得到HTML内容的问题

解决Android应用请求返回HTML而非JSON的问题

嘿,看起来你碰到了服务器的反爬/人机验证坎儿了——返回的内容里带aes.js和加密逻辑,这明显是服务器在验证你是不是真实用户,而不是自动化爬虫。大概率是Cloudflare这类网站防护工具在搞事情,我给你几个实用的解决思路:

1. 先把请求头改成浏览器同款

服务器很多时候靠请求头判断请求来源,你得把Android里的请求头伪装成正常浏览器的样子,几个关键头不能少:

  • User-Agent:直接抄主流桌面浏览器的,比如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
  • Accept:明确告诉服务器你要JSON,设成application/json, text/javascript, */*; q=0.01
  • Referer:如果接口是从某个页面跳转过来的,添上那个页面的URL
  • Cookie:先在浏览器里访问目标网站,抓包拿到有效Cookie,直接搬过来用

要是你用OkHttp发请求,这么改就行:

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(chain -> {
        Request original = chain.request();
        Request request = original.newBuilder()
            .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
            .header("Accept", "application/json, text/javascript, */*; q=0.01")
            .header("Referer", "https://你的目标域名.com/")
            .header("Cookie", "从浏览器抓的Cookie值")
            .build();
        return chain.proceed(request);
    })
    .build();

2. 处理Cloudflare这类防护的验证逻辑

如果确实是Cloudflare的验证,有两种常见玩法:

  • 用WebView“躺赢”:直接在Android里用WebView加载目标接口,等WebView自动完成人机验证(比如滑动拼图、点击验证),然后从WebView里拿验证后的Cookie,再用这个Cookie去请求JSON接口。代码大概是这样:
WebView webView = new WebView(context);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 拿验证后的Cookie
        String validCookie = CookieManager.getInstance().getCookie(url);
        // 带着这个Cookie去请求JSON
        fetchJsonWithCookie(validCookie);
    }
});
webView.loadUrl("https://你的目标接口地址.com");
  • 手动计算验证参数:如果不想用WebView,就得把返回HTML里的JavaScript加密逻辑扒出来,用Java或者Android里的JS引擎(比如Rhino)执行,算出服务器要的验证参数,再构造新请求带过去。不过这个方法比较费时间,得啃JS代码。

3. 确认是不是没登录/会话失效

有时候返回HTML是因为你没登录,服务器直接跳转到登录页面了。先在浏览器里完成登录流程,抓包拿到登录后的会话Cookie,再把这个Cookie加到Android的请求里,大概率就能拿到正常的JSON了。

4. 检查请求是不是被重定向了

用Charles或者Fiddler抓个包看看,你的请求是不是被服务器302重定向到验证页面了?如果是,得跟着重定向走,先处理验证,再去请求目标接口。

友情提醒:别忽略网站的使用条款和robots.txt,确保你的请求合规,别给自己惹麻烦哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:18:27