Перенаправление с помощью Curl/HttpClient:заголовок “Местоположение” отсутствует
Вопрос
когда я получаю следующий URL-адрес с завиток
curl -D headers.http "http://www.springerlink.com/index/10.1007/s00453-007-9157-8"
файл headers.http содержит заголовок "Location":
HTTP/1.1 302 Found
Date: Tue, 27 Oct 2009 17:00:20 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Location: http://www.springerlink.com/link.asp?id=c104731297q64224
Set-Cookie: CookiesSupported=True; expires=Wed, 27-Oct-2010 17:00:20 GMT; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 173
но когда я использовал библиотеку apache httpclient, этот заголовок "Location:" отсутствовал (?).
int status = httpClient.executeMethod(method);
if(status!=HttpStatus.SC_OK &&
status!=HttpStatus.SC_MOVED_TEMPORARILY &&
status!=HttpStatus.SC_MOVED_PERMANENTLY
)
{
throw new IOException("connection failure for "+url+" status:"+status);
}
Header header=method.getResponseHeader("Location");
if(header==null )
{
for(Header h:method.getResponseHeaders())
{
LOG.info(h.toString());
}
throw new IOException(
"Expected a redirect for "+url
);
}
Я перечислил заголовки ниже:
INFO: Date: Tue, 27 Oct 2009 17:05:13 GMT
INFO: Server: Microsoft-IIS/6.0
INFO: X-Powered-By: ASP.NET
INFO: X-AspNet-Version: 2.0.50727
INFO: Set-Cookie: ASP.NET_SessionId=js1o5wqnuhuh24islnvkyr45; path=/; HttpOnly
INFO: Cache-Control: private
INFO: Content-Type: text/html; charset=utf-8
INFO: Content-Length: 17245
эээ ???
Решение
Что происходит, это с curl
, вы получаете 302 который на самом деле является перенаправлением на URL в заголовке location.
С помощью Apache httpclient он выполняет перенаправление за вас и возвращает заголовки из запроса в перенаправленное местоположение.
Чтобы продемонстрировать это, попробуйте
curl -D headers.http "http://www.springerlink.com/link.asp?id=c104731297q64224"
и сравните полученный отклик.
Редактировать:На самом деле там около 4 перенаправлений, если вы проследите за каждым заголовком location с помощью curl.
Другие советы
http://www.springerlink.com/index/10.1007/s00453-007-9157-8 на самом деле это редирект.С тех пор, как -D
опция означает "только заголовки", первая из них не перенаправляет на указанный Location: ...
, в то время как второй - да.Взгляните на Объем контента, он сильно отличается.
Что происходит, когда вы упускаете из виду -D
?
Добавьте это
method.setFollowRedirects(false);
Перед выполнением метода.
HttpClient по умолчанию автоматически выполняет перенаправление, а Curl - нет.