【问题标题】:Apache httpclient returning page before it loads?Apache httpclient在加载之前返回页面?
【发布时间】:2010-10-25 17:20:27
【问题描述】:

我在使用 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

除了亚马逊网站之外,我找不到其他网站可以复制这种行为,但我认为还有其他网站。

我知道,根据http://hc.apache.org/httpclient-3.x/performance.html 的文档不鼓励使用getResponseBodyAsString(),它并没有说页面不会加载,只是你可能面临内存不足异常的风险。 getResponseBodyAsString() 是否有可能在页面加载之前返回页面?为什么这只发生在亚马逊上?

【问题讨论】:

    标签: java apache amazon httpclient


    【解决方案1】:

    您是否使用任何其他 URL 进行了测试?

    您提供的代码中的 URL 使用 302 重定向到 http://www.amazon.com/dp/05961580/?tag=stackoverfl08-20,然后返回 404(未找到)。

    HttpClient 不处理重定向:http://hc.apache.org/httpclient-3.x/redirects.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多