2

, когда я получаю следующий URL с завиткаПеренаправление с Curl/HttpClient: заголовок "Location" отсутствует

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 library, этот заголовок «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 

UHH ???

ответ

2

Что происходит, так это то, что с curl вы получаете 302, который на самом деле является переадресацией, на URL-адрес в заголовке местоположения.

С помощью apache httpclient он выполняет перенаправление для вас и возвращает заголовки из запроса в перенаправленное местоположение.

Чтобы продемонстрировать это попробовать

curl -D headers.http "http://www.springerlink.com/link.asp?id=c104731297q64224" 

и сравнить реакцию.

edit: На самом деле существует около 4 переадресаций, если вы следуете за каждым заголовком местоположения через curl.

0

http://www.springerlink.com/index/10.1007/s00453-007-9157-8 на самом деле является переадресацией. Поскольку параметр -D означает «только заголовки», первый не перенаправляется на указанный Location: ..., а второй. Взгляните на Content-Length, это сильно отличается.

Что происходит, если вы не учитываете -D?

+0

С моей версией curl "-D/- dump-header Напишите заголовки в этот файл". Это не только «заголовки». С или без -D результат был таким же. – Pierre

+0

Итак, похоже, что команда curl с низким уровнем не выполняет перенаправления, а ваш java curl client. Это. – davethegr8

0

Добавить

method.setFollowRedirects(false); 

Перед тем, как выполнить метод.

HttpClient автоматически перенаправляет по умолчанию, но Curl этого не делает.