我正在解码http数据包。 我遇到了一个问题,就是问题。 当我得到一个http数据包时,它有一个标题和正文。 当transefer-encoding被分块时,我不知道该怎么办?
是否有一个有用的API或类来解除JAVA中的数据?
如果有人经历过http解码,请告诉我如何做到这一点?
答案 0 :(得分:12)
使用完整的HTTP客户端,例如Apache HttpComponents Client,或者只使用提供的java.net.URLConnection
mini tutorial here(ChunkedInputStream
)。两者都完全透明地处理它并为您提供“正常”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
实施。