我正在解码http数据包。我遇到了块问题。当我收到一个 http 数据包时,它有一个标题和正文。当传输编码被分块时,我不知道该怎么办?
是否有有用的 API 或类用于对 JAVA 中的数据进行解块?
如果有人对http解码有经验,请告诉我如何做到这一点?
我正在解码http数据包。我遇到了块问题。当我收到一个 http 数据包时,它有一个标题和正文。当传输编码被分块时,我不知道该怎么办?
是否有有用的 API 或类用于对 JAVA 中的数据进行解块?
如果有人对http解码有经验,请告诉我如何做到这一点?
使用完整的 HTTP 客户端,例如Apache HttpComponents Client或仅提供 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 )。它为您处理分块传输编码,您可以将整个正文作为字符串返回。
从文档:
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 to byte array in Java中选择任何readFully
实现。