【问题标题】:Java: HttpComponents gets rubbish Response from input Stream from a specific URLJava:HttpComponents 从特定 URL 的输入流中获取垃圾响应
【发布时间】:2011-08-27 13:23:33
【问题描述】:

我目前正在尝试让 HttpComponents 发送 HttpRequests 并检索响应。 在大多数 URL 上,这都没有问题,但是当我尝试获取 phpBB 论坛的 URL 时,即http://www.forum.animenokami.com,客户端需要更多时间,并且 responseEntity 包含不止一次的段落,导致 html 文件损坏。

例如,元标记包含六次。由于许多其他 URL 有效,我无法弄清楚我做错了什么。 该页面在已知浏览器中正常工作,因此这不是他们方面的问题。

这是我用来发送和接收的代码。

        URI uri1 = new URI("http://www.forum.animenokami.com");
    HttpGet get = new HttpGet(uri1);
    get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0"));
    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(get);
    HttpEntity ent = response.getEntity();
    InputStream is = ent.getContent();
    BufferedInputStream bis = new BufferedInputStream(is);
    byte[] tmp = new byte[2048];
    int l;
    String ret = "";
    while ((l = bis.read(tmp)) != -1){
        ret += new String(tmp);
    }

我希望你能帮助我。 如果您需要更多信息,我会尽快提供。

【问题讨论】:

    标签: java httprequest inputstream apache-httpcomponents


    【解决方案1】:

    这段代码完全被破坏了:

    String ret = "";
    while ((l = bis.read(tmp)) != -1){
        ret += new String(tmp);
    }
    

    三件事:

    • 这会在每次迭代时将整个缓冲区转换为字符串,而不管读取了多少数据。 (我怀疑这就是您的实际问题所在。)
    • 它使用默认平台编码,这几乎不是一个好主意。
    • 它在循环中使用字符串连接,导致性能不佳。

    幸运的是,您可以使用EntityUtils 轻松避免所有这些:

    String text = EntityUtils.toString(ent);
    

    这将使用响应中指定的适当字符编码(如果有),否则使用 ISO-8859-1。 (如果没有指定,还有另一个重载允许您指定要使用的字符编码。)

    值得了解您的原始代码有什么问题,而不是只是用更好的代码替换它,这样您就不会在其他情况下犯同样的错误。

    【讨论】:

    • 很好,谢谢。它工作正常,但我不明白为什么我只在这个 URL 上多次看到相同的文本。我对其他 URL 没有这个问题。每次转换整个 Buffer 应该只是最后一个字节的问题,因为剩下不到 2048 个字节,对吧? Buffer 中的内容也将在每次迭代时被替换,因此不会导致输出重复。
    【解决方案2】:

    它工作正常,但我不明白为什么我只在此 URL 上多次看到相同的文本。

    这将是因为您的客户端在读取套接字时会看到更多不完整的缓冲区。可能是:

    • 因为从远程站点到您的客户端的路由存在网络带宽瓶颈,
    • 因为远程站点正在执行一些不必要的刷新,或者
    • 其他原因。

    关键是您的客户端必须密切注意read调用读入缓冲区的字节数,否则最终会插入垃圾。尤其是网络流很容易无法填满缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多