在Java中分块的http解码?

时间:2010-09-15 12:40:41

标签: java http chunked-encoding

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

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

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

4 个答案:

答案 0 :(得分:12)

使用完整的HTTP客户端,例如Apache HttpComponents Client,或者只使用提供的java.net.URLConnection mini tutorial hereChunkedInputStream)。两者都完全透明地处理它并为您提供“正常”InputStream背面。反过来,HttpClient还附带一个this Wikipedia article,您只需用InputStream来装饰它。

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

答案 1 :(得分:1)

Apache HttpComponents

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

答案 2 :(得分:1)

如果您正在寻找一个简单的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);

答案 3 :(得分:1)

这是一个快速而又脏的替代方案,除了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 to byte array in Java选择任何readFully实施。