在Java中分块的http解码?

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

是否有一个有用的API或类来解除JAVA中的数据?

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

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

如果你真的坚持为这个库增加一个库,那么我建议创建一个类,如ChunkedInputStream extends InputStream并相应地编写逻辑。 您可以在Wikipedia文章中找到有关如何解析它的更多详细信息。

Apache HttpComponents

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

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

来自文档:

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

除了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); } 

它使用相同的sun.net.www.http.ChunkedInputStream作为java.net.HttpURLConnection在场景后面做。

此实现不提供错误内容格式的详细例外(行号)。

它适用于Java 8,但可能在下一版本中失败。 你被警告过了。

虽然可以用于原型设计。

您可以选择从Convert InputStream到Java中的字节数组的任何readFully实现。