2010-10-25 2 views
1

Я заметил странное явление при использовании библиотек apache httpclient, и я хочу знать, почему это происходит. Я создал образец кода для демонстрации. Рассмотрим следующий код:Apache httpclient возвращает страницу перед загрузкой?

//Example URL 
String url = "http://rads.stackoverflow.com/amzn/click/05961580"; 
GetMethod get = new GetMethod(url); 
HttpMethodRetryHandler httpHandler = new DefaultHttpMethodRetryHandler(1, false); 
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, httpHandler); 
get.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES); 
HttpConnectionManager connectionManager = new SimpleHttpConnectionManager(); 
HttpClient client = new HttpClient(connectionManager); 
client.getParams().setParameter("http.useragent", FIREFOX); 
String line; 
StringBuilder stringBuilder = new StringBuilder(); 
String toStreamBody = null; 
String toStringBody = null; 
try { 
    int statusCode = client.executeMethod(get); 
    if(statusCode != HttpStatus.SC_OK){ 
    System.err.println("Internet Status: " + HttpStatus.getStatusText(statusCode)); 
    System.err.println("While getting page: " + url); 
    } 
//toString 
    toStringBody = get.getResponseBodyAsString(); 
//toStream 
    InputStreamReader isr = new InputStreamReader(get.getResponseBodyAsStream()) 
    BufferedReader rd = new BufferedReader(isr); 
    while ((line = rd.readLine()) != null) { 
    stringBuilder.append(line); 
    } 
} catch (java.io.IOException ex) { 
    System.out.println("Failed to get page: " + url); 
} finally { 
    get.releaseConnection(); 
}  
toStreamBody = stringBuilder.toString(); 

Этот код ничего не выводит:

System.out.println(toStringBody); // "" 

Этот код выводит на веб-страницу:

System.out.println(toStreamBody); // "Whole Page" 

Но это становится еще более странно ... Заменить:

get.getResponseBodyAsString(); 

С:

get.getResponseBodyAsString(150000); 

Теперь мы получаем ошибку: Не удалось получить страницу: http://www.amazon.com/gp/offer-listing/0596158068/ref=dp_olp_used?ie=UTF8

Я не смог найти другой сайт, кроме для амазонки, что дублирует это поведение, но я предполагаю, что есть и другие.

Я знаю, что в соответствии с документацией в http://hc.apache.org/httpclient-3.x/performance.html запрещается использование getResponseBodyAsString(), он не говорит, что страница не загружается, только если у вас может возникнуть исключение из памяти. Возможно ли, что getResponseBodyAsString() возвращает страницу до того, как она загрузится? Почему это происходит только с амазонок?

ответ

0

Проводили ли вы проверку с помощью любого другого URL-адреса?

URL в коде, который вы предоставили, перенаправляет с 302 на http://www.amazon.com/dp/05961580/?tag=stackoverfl08-20, который затем возвращает 404 (не найден).

HttpClient не обрабатывает редиректы: http://hc.apache.org/httpclient-3.x/redirects.html

+0

О, это не ссылка. Я попытаюсь изменить его. – Bob

+0

Сайт http://www.amazon.com/gp/offer-listing/0596158068/ref=dp_olp_used?ie=UTF8 – Bob

+0

Хорошо, по какой-то причине сайт изменился на веб-сайт. Я ничего не могу с этим поделать. – Bob

Смежные вопросы