在 Java CloseableHttpClient 中排序 headers

Ordering of headers in Java CloseableHttpClient

我正在使用 java 中的 CloseableHttpClient 库来抓取网站,并根据网站添加自己的自定义 headers,然后再将请求发送到网页。

虽然 header 的排序不是强制性的,但某些网站确实使用 header 排序作为指纹识别的一种形式。特别是在 CloseableHttpClient 库中,在将 HTTP 请求发送到目的地之前,header 主机、Cache-Control、连接等被添加到末尾。它看起来像这样:

    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15 646F636F6D6F3031",
    "accept": "*/*",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-US,en;q=0.9",
    "host": "www.example.com",
    "via": "1.1 localhost (squid/4.13)",
    "x-forwarded-for": "www.example.com",
    "cache-control": "max-age=259200",
    "connection": "keep-alive"

我的代码是这样工作的:

CloseableHttpClient innerClient;

HttpGet request = new HttpGet(my_url);
client.execute(request, my_context);

header添加到 HttpGet object:

request.addHeader("Key", "Value");

无论我尝试过什么,Host 和它下面的 headers [如上例所示] 都会添加到最后。有没有办法控制他们的位置?

有一种方法可以使用 HttpClient 来处理这个问题。

如果我们想在发送请求之前执行一轮cleanup/reordering,我们可以使用addInterceptorLast()方法,如下所示。

HttpClient httpClient = HttpClientBuilder.create().addInterceptorLast( 
                        new HttpRequestInterceptor() {
                            public void process(HttpRequest request, HttpContext context){
                                // Handle the ordering here.
                            }
                        }   
                ).build();