Apache httpclient возвращает страницу перед загрузкой? - PullRequest
1 голос
/ 25 октября 2010

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

//Example URL
 String url = "http://www.amazon.com/gp/offer-listing/05961580/ref=dp_olp_used?ie=UTF8";
 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

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

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

1 Ответ

0 голосов
/ 25 октября 2010

Вы тестировали с любым другим URL?

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

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

...