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解码?的主要内容,如果未能解决你的问题,请参考以下文章