我正在解码HTTP数据包。遇到了分块问题。
当我收到一个HTTP数据包时,它有头部和正文。
当传输编码是分块的时候,我不知道该怎么做?
在JAVA中是否有用的API或类可以解除数据块?
如果有经验的HTTP解码人员,请告诉我如何解决这个问题?
在JAVA中是否有用的API或类可以解除数据块?
如果有经验的HTTP解码人员,请告诉我如何解决这个问题?
使用一个完整的HTTP客户端,例如Apache HttpComponents Client或者Java SE提供的java.net.URLConnection
(这里有个小教程)。两者都会自动处理并返回一个"普通"的InputStream
。HttpClient还提供了一个ChunkedInputStream
类,您可以将其与InputStream
结合使用。
如果您坚持要编写自己的库,则建议创建一个类似于ChunkedInputStream extends InputStream
的类,并相应地编写逻辑。 您可以在这篇维基百科文章中找到更多解析信息。
HttpRequest httpRequest = HttpRequest.get("http://jodd.org");
HttpResponse response = httpRequest.send();
System.out.println(response);
Apache HttpComponents。
哦,如果我们谈论客户端,HttpUrlConnection 也可以做到这一点。
这里有一个快速而简单的替代方案,除了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);
}
它使用与java.net.HttpURLConnection
背后的sun.net.www.http.ChunkedInputStream
相同的内容。
此实现不会提供有关错误内容格式的详细异常(行号)。
它适用于Java 8,但在下一个版本中可能会失败。你已经被警告了。
虽然对于原型设计可能很有用。
您可以从Convert InputStream to byte array in Java中选择任何readFully
实现。
ChunkedInputStream
正是这样做的。 - BalusCChunkedInputStream
部分是可点击的(就像所有其他蓝色部分一样)。它是一个InputStream
,你可以用它来装饰另一个InputStream
。例如:InputStream input = new ChunkedInputStream(originalInput);
。 - BalusC