【问题标题】:Java - DefaultHttpClient and "Host" header [Apache HttpComponent]Java - DefaultHttpClient 和“主机”标头 [Apache HttpComponent]
【发布时间】:2026-01-27 09:10:01
【问题描述】:

我正在通过 DefaultHttpClient 提交多个 HTTP 请求。问题是“主机”标头从未在请求​​中设置。例如通过执行以下 GET 请求:

HttpUriRequest request = new HttpGet("http://www.myapp.com");
org.apache.http.client.HttpClient client = new DefaultHttpClient();
HttpResponse httpResponse = client.execute(request);

生成的请求对象没有设置强制的“Host”标头的值:

Host: myapp.com

有什么建议吗?

【问题讨论】:

    标签: java header httprequest host apache-httpcomponents


    【解决方案1】:

    我的错。实际上,DefaultHttpClient 确实添加了 Host 标头,这是 HTTP 规范所要求的。

    我的问题是由于我之前添加的另一个自定义标头,其值以 “\r\n”。这使DefaultHttpClient 自动添加的所有后续标头无效。 我正在做类似的事情:

    HttpUriRequest request = new HttpGet("http://www.myapp.com");
    org.apache.http.client.HttpClient client = new DefaultHttpClient();
    request.addHeader(new BasicHeader("X-Custom-Header", "Some Value\r\n");
    HttpResponse httpResponse = client.execute(request);
    

    在 HTTP 请求中生成以下 Header 序列:

    GET /index.html HTTP/1.1
    X-Custom-Header: Some value
    
    Host: www.example.com
    

    X-Custom-HeaderHost 之间的空格使 Host 标头无效。 修正:

    HttpUriRequest request = new HttpGet("http://www.myapp.com");
    org.apache.http.client.HttpClient client = new DefaultHttpClient();
    request.addHeader(new BasicHeader("X-Custom-Header", "Some Value");
    HttpResponse httpResponse = client.execute(request);
    

    生成:

    GET /index.html HTTP/1.1
    X-Custom-Header: Some value
    Host: www.example.com
    

    【讨论】:

    • 好收获!在我的情况下(在 Android 上),我使用 Base64 编码带有 Base64.DEFAULT 的标头值,其中包括行终止符。结果,自定义标头之后出现的所有键值对都搞砸了(通过代理运行请求时甚至看不到它们)。切换到Base64.NO_WRAP 解决了我的问题,因为它省略了所有行终止符(即输出是一条长行)。
    【解决方案2】:

    只需使用addHeader 设置请求的主机头。

    【讨论】:

    • 很好的答案。我能够为Host 设置自定义值,并通过获取djce.org.uk/dumprequest 来确认它是否有效。该页面转储了它收到的标头,果然,Host 的值是我设置的(不是djce.org.uk,如果没有更改主机值,它将是什么)。