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

Android中HTMLUnit添加/移除请求头未生效问题咨询

问题描述

我尝试使用HTMLUnit解析网页,创建了如下WebClient实例:

val webClient = WebClient(BrowserVersion.FIREFOX);
webClient.addRequestHeader("X-Requested-With", "XMLHttpRequest")
webClient.addRequestHeader(
            "User-Agent",
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
        )

webClient.removeRequestHeader("Sec-Fetch-Mode")
webClient.removeRequestHeader("Sec-Fetch-User")
webClient.removeRequestHeader("Sec-Fetch-Site")
webClient.removeRequestHeader("Sec-Fetch-Dest")
webClient.removeRequestHeader("Upgrade-Insecure-Requests=1")
webClient.addRequestHeader("TEST HEADER", "application/json")
return webClient;

执行移除指定请求头、添加自定义请求头的操作后,从响应中读取请求头时发现配置未生效:移除的请求头仍存在,添加的TEST HEADER也未出现,收到的请求头如下:

{Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8, X-Requested-With=XMLHttpRequest, Upgrade-Insecure-Requests=1, User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36, Sec-Fetch-Dest=document, Sec-Fetch-Site=same-origin, Sec-Fetch-User=?1, Accept-Encoding=gzip, deflate, br, Accept-Language=en-US,en;q=0.5, Sec-Fetch-Mode=navigate}
原因分析与解决方案

1. 移除请求头失败的原因

  • 移除目标错误:你写的webClient.removeRequestHeader("Upgrade-Insecure-Requests=1")是错误的,请求头名称是Upgrade-Insecure-Requests,而非带值的Upgrade-Insecure-Requests=1,这行代码等于移除一个不存在的请求头,自然不会生效。
  • HTMLUnit自动补全机制:Sec-Fetch-*这类属于浏览器标准请求头,HTMLUnit会根据你设置的BrowserVersion自动生成并添加这些头,直接调用removeRequestHeader无法阻止它们被自动注入。

2. 自定义请求头未生效的原因

直接通过webClient.addRequestHeader添加的全局头,可能会被后续请求的局部设置覆盖,或者因请求类型(普通页面请求/AJAX请求)差异导致未被携带;如果请求是页面JavaScript发起的,全局头也可能不会自动应用。

具体解决步骤

  • 修正移除请求头代码:将webClient.removeRequestHeader("Upgrade-Insecure-Requests=1")改为webClient.removeRequestHeader("Upgrade-Insecure-Requests")。
  • 拦截自动生成的请求头:添加自定义HttpRequestInterceptor,在请求发送前强制移除不需要的头并添加自定义头,这种方式比全局设置更可靠:
webClient.addRequestInterceptor { request, _ ->
    request.removeHeader("Sec-Fetch-Mode")
    request.removeHeader("Sec-Fetch-User")
    request.removeHeader("Sec-Fetch-Site")
    request.removeHeader("Sec-Fetch-Dest")
    request.addHeader("TEST HEADER", "application/json")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:27:25