Java - DefaultHttpClient和“Host”头 [Apache HttpComponent]

8
我将通过DefaultHttpClient提交多个HTTP请求。问题在于请求中的"Host"头部从未被设置。例如,执行以下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

有什么提示吗?

2个回答

10

我的错。实际上,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请求中生成了以下标头序列:

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

2
很好的发现!在我的情况下(在Android上),我使用Base64.DEFAULT对头部值进行了Base64编码,其中包括行终止符。结果是,在自定义头之后的所有键值对都被搞乱了(当通过代理运行请求时甚至看不到它们)。切换到Base64.NO_WRAP解决了我的问题,因为它省略了所有行终止符(也就是说,输出是一行长的)。 - MH.

3
只需使用addHeader在请求中设置主机头即可。

很好的答案。我能够为“Host”设置自定义值,并通过获取http://djce.org.uk/dumprequest来确认它是否有效。该页面会将其接收到的标头转储回来,确实,“Host”的值是我设置的值(如果未更改主机值,则为“djce.org.uk”)。 - Steve HHH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接