java中的分块http解码?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 实现。

【讨论】:

以上是关于java中的分块http解码?的主要内容,如果未能解决你的问题,请参考以下文章

http/2 中的分块下载是如何工作的(或者更好的是啥是等效的?)

HTTP协议之chunk编码(分块传输编码)

.NET 中的分块编码实现(或至少是伪代码)

java内存模型及分块

libevent2 中的分块响应

Java虚拟中内存分块