Java - DefaultHttpClient和"Host"头[Apache HttpComponent]

Mar*_*ark 8 java host header httprequest apache-httpcomponents

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

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

生成的请求对象不会使用以下值设置必需的"主机"标头:

Host: myapp.com
Run Code Online (Sandbox Code Playgroud)

有小费吗?

Mar*_*ark 9

我的错.实际上,DefaultHttpClientdo会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);
Run Code Online (Sandbox Code Playgroud)

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

GET /index.html HTTP/1.1
X-Custom-Header: Some value

Host: www.example.com
Run Code Online (Sandbox Code Playgroud)

标题之间的空格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);
Run Code Online (Sandbox Code Playgroud)

这会产生:

GET /index.html HTTP/1.1
X-Custom-Header: Some value
Host: www.example.com
Run Code Online (Sandbox Code Playgroud)

  • 接得好!就我而言(在 Android 上),我使用 [`Base64.DEFAULT`](http://developer.android.com/reference/android/util/Base64.html#DEFAULT) 对标头值进行 Base64 编码,其中包括行终止符。结果,自定义标头之后的所有键值对都变得混乱(通过代理运行请求时甚至看不到它们)。切换到 [`Base64.NO_WRAP`](http://developer.android.com/reference/android/util/Base64.html#NO_WRAP) 解决了我的问题,因为它省略了所有行终止符(也就是说,输出是一个长线)。 (2认同)