我正在解码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实现。