【问题标题】:Chunked http decoding in java?java中的分块http解码?
【发布时间】:2011-04-12 16:06:12
【问题描述】:

我正在解码 http 数据包。 我遇到了块问题。 当我收到一个 http 数据包时,它有一个标题和正文。 当传输编码被分块时我不知道该怎么办?

是否有有用的 API 或类用于在 JAVA 中对数据进行解块?

如果有人对 http 解码有经验,请告诉我如何做到这一点?

【问题讨论】:

    标签: java http chunked-encoding


    【解决方案1】:

    阿帕奇HttpComponents

    哦,如果我们谈论的是客户端,HttpUrlConnection 也会这样做。

    【讨论】:

    • 我将离线http解码(已经捕获的数据包),我只有一个标题和一个正文。所以我需要一个 api,它只获取标题和正文并给我解码数据。有没有这样的api?
    【解决方案2】:

    使用像 Apache HttpComponents Client 这样的完整的 HTTP 客户端,或者只使用 Java SE 提供的 java.net.URLConnection (mini tutorial here)。两者都完全透明地处理它,并为您提供“正常”InputStream 返回。 HttpClient 反过来也带有一个ChunkedInputStream,你只需要用它来装饰你的InputStream

    如果你真的坚持要为此开发一个库,那么我建议创建一个像 ChunkedInputStream extends InputStream 这样的类并相应地编写逻辑。您可以在this Wikipedia article 中找到更多详细信息。

    【讨论】:

    • 实际上我进行了离线http解码,我只有http数据包的标题和正文。我将解码数据包。但我需要一个获取标题和正文并为我提供解码数据的 api。有这样的api吗?
    • 维基百科文章详细介绍了块的外观。您基本上可以在 CRLF (\r\n) 上拆分。它是字节 10 和 13。第一部分是标头,它以十六进制表示块长度。第二部分是块数据本身。您只需收集并连接所有这些块。 ChunkedInputStream 正是这样做的。
    • 对不起,有两个 ChunkedInputStream 类第一个:jigsaw.w3.org/Doc/Programmer/api/org/w3c/www/http/… 第二个:hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/… 哪个适合这个?你有关于如何使用 ChunkedInputStream 的任何信息吗?
    • 我的答案中的ChunkedInputStream 部分是可点击的(与所有其他蓝色部分一样)。这是一个InputStream,你可以用它装饰另一个InputStream。例如。 InputStream input = new ChunkedInputStream(originalInput);.
    • 首先感谢您的回答,他们确实帮助了我。但是我还有一个问题 ChunkedInputStream 构造函数获取 SessionInputBuffer(interface) 我将如何将字符串(chunked body) 转换为这种格式?
    【解决方案3】:

    如果您正在寻找简单的 API,请尝试 Jodd Http 库 (http://jodd.org/doc/http.html)。 它为您处理分块传输编码,您可以将整个正文作为字符串返回。

    来自文档:

    HttpRequest httpRequest = HttpRequest.get("http://jodd.org");
    HttpResponse response = httpRequest.send();
    
    System.out.println(response);
    

    【讨论】:

      【解决方案4】:

      这是一个快速而简单的替代方案,除了 Oracle JRE 之外不需要依赖:

      private static byte[] unchunk(byte[] content) throws IOException {
          ByteArrayInputStream bais = new ByteArrayInputStream(content);
          ChunkedInputStream cis = new ChunkedInputStream(bais, new HttpClient() {}, null);
          return readFully(cis);
      }
      

      它使用与java.net.HttpURLConnection 在幕后使用相同的sun.net.www.http.ChunkedInputStream

      此实现未提供有关错误内容格式的详细异常(行号)。

      它适用于 Java 8,但在下一个版本中可能会失败。您已收到警告。

      可能对原型设计很有用。

      您可以从Convert InputStream to byte array in Java 中选择任何readFully 实现。

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 2011-12-06
        • 2010-09-24
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 2016-04-08
        • 2016-12-29
        • 2011-12-06
        相关资源
        最近更新 更多