Я заметил странное явление при использовании библиотек 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()
возвращает страницу до того, как она загрузится? Почему это происходит только с амазонок?
О, это не ссылка. Я попытаюсь изменить его. – Bob
Сайт http://www.amazon.com/gp/offer-listing/0596158068/ref=dp_olp_used?ie=UTF8 – Bob
Хорошо, по какой-то причине сайт изменился на веб-сайт. Я ничего не могу с этим поделать. – Bob