GET请求返回403 Forbidden,apitester正常但Android端异常求助
我之前也碰到过一模一样的情况——API在测试工具里跑得好好的,到Android端就直接403拒接,大概率是服务端的权限校验卡了请求细节。咱们一步步排查:
User-Agent 缺失或不匹配
很多服务端会严格校验请求的User-Agent,API测试工具默认带的是浏览器风格的标识(比如Chrome的UA),但OkHttp默认的User-Agent是OkHttp/[版本号],一眼就能被识别为非浏览器请求。你可以把测试工具里的User-Agent原封不动加到请求里试试:.addHeader("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、Accept-Encoding、Accept-Language这些,而你的代码里没加,服务端可能因为这些头缺失判定请求不合法。把测试工具里的所有请求头都复制过来:.addHeader("Accept", "*/*") .addHeader("Accept-Encoding", "gzip, deflate, br") .addHeader("Accept-Language", "en-US,en;q=0.9")HMAC签名的生成或时效性问题
你生成的auth签名可能有有效期,或者Android端生成的签名和测试工具里的不一致。建议打印出Android端的auth值,和测试工具里的对比;另外,有些签名会绑定时间戳,如果你的设备时间和服务器时间偏差太大,也会导致签名失效。Referer头的细微差异
你设置的Referer是https://hotstar.com/movies/2-states/1000034502,试试加上www改成https://www.hotstar.com/movies/2-states/1000034502——部分服务端会严格校验域名的完整性。TLS版本不兼容
有些服务端会限制TLS版本,测试工具用的是浏览器的TLS配置,而OkHttp默认配置可能不匹配。你可以强制OkHttp使用更高版本的TLS:OkHttpClient client = new OkHttpClient.Builder() .connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS)) .build();
优先从User-Agent入手调整,这是最常见的403诱因,一般改完就能正常请求了。
内容的提问来源于stack exchange,提问作者INDIERs




