【发布时间】:2011-04-12 16:06:12
【问题描述】:
我正在解码 http 数据包。 我遇到了块问题。 当我收到一个 http 数据包时,它有一个标题和正文。 当传输编码被分块时我不知道该怎么办?
是否有有用的 API 或类用于在 JAVA 中对数据进行解块?
如果有人对 http 解码有经验,请告诉我如何做到这一点?
【问题讨论】:
标签: java http chunked-encoding
我正在解码 http 数据包。 我遇到了块问题。 当我收到一个 http 数据包时,它有一个标题和正文。 当传输编码被分块时我不知道该怎么办?
是否有有用的 API 或类用于在 JAVA 中对数据进行解块?
如果有人对 http 解码有经验,请告诉我如何做到这一点?
【问题讨论】:
标签: java http chunked-encoding
哦,如果我们谈论的是客户端,HttpUrlConnection 也会这样做。
【讨论】:
使用像 Apache HttpComponents Client 这样的完整的 HTTP 客户端,或者只使用 Java SE 提供的 java.net.URLConnection (mini tutorial here)。两者都完全透明地处理它,并为您提供“正常”InputStream 返回。 HttpClient 反过来也带有一个ChunkedInputStream,你只需要用它来装饰你的InputStream。
如果你真的坚持要为此开发一个库,那么我建议创建一个像 ChunkedInputStream extends InputStream 这样的类并相应地编写逻辑。您可以在this Wikipedia article 中找到更多详细信息。
【讨论】:
ChunkedInputStream 正是这样做的。
ChunkedInputStream 部分是可点击的(与所有其他蓝色部分一样)。这是一个InputStream,你可以用它装饰另一个InputStream。例如。 InputStream input = new ChunkedInputStream(originalInput);.
如果您正在寻找简单的 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);
}
它使用与java.net.HttpURLConnection 在幕后使用相同的sun.net.www.http.ChunkedInputStream。
此实现未提供有关错误内容格式的详细异常(行号)。
它适用于 Java 8,但在下一个版本中可能会失败。您已收到警告。
可能对原型设计很有用。
您可以从Convert InputStream to byte array in Java 中选择任何readFully 实现。
【讨论】: