Java — заголовок DefaultHttpClient и узла [Apache HttpComponent]

Я отправляю несколько HTTP-запросов через DefaultHttpClient. Проблема в том, что заголовок "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

Какие-нибудь советы?


person Mark    schedule 30.07.2011    source источник


Ответы (2)


Моя вина. На самом деле 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-Header и Host делал заголовок 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
person Mark    schedule 02.08.2011
comment
Хороший улов! В моем случае (на Android) я кодировал значение заголовка Base64 с помощью Base64.DEFAULT , который включает в себя разделители строк. В результате все пары ключ-значение, идущие после пользовательского заголовка, испортились (даже не мог их увидеть при выполнении запроса через прокси). Переключение на Base64.NO_WRAP решило мою проблему, так как пропускает все строки терминаторов (то есть на выходе получается одна длинная строка). - person MH.; 17.03.2015

Просто установите заголовок хоста в запросе, используя addHeader.

person Alex Gitelman    schedule 30.07.2011