Перенаправление с помощью Curl / HttpClient: отсутствует заголовок "Location" - PullRequest
2 голосов
/ 27 октября 2009

когда я получаю следующий URL с curl

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

э-э-э

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

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

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

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

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

и сравните ответ.

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

0 голосов
/ 27 октября 2009

Добавить

  method.setFollowRedirects(false); 

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

HttpClient по умолчанию выполняет перенаправление, а Curl - нет.

0 голосов
/ 27 октября 2009

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

Что происходит, когда вы пропускаете -D?

...