java中的分块http解码?

java中的分块http解码?,java,http,chunked-encoding,Java,Http,Chunked Encoding,我正在解码http数据包。 我面临一个问题,那就是块问题。 当我得到一个http包时,它有一个头和主体。 当Transfer编码被分块时,我不知道该怎么办 是否有一个有用的API或类用于在JAVA中提取数据 如果有人对http解码有经验,请告诉我一种方法如何做到这一点?Apache 哦,如果我们讨论的是客户端,那么也可以这样做。使用一个完全值得使用的HTTP客户端,比如Java SE()。两者都以完全透明的方式处理它,并为您提供“正常”的InputStream返回。HttpClient反过来还附

我正在解码http数据包。 我面临一个问题,那就是块问题。 当我得到一个http包时,它有一个头和主体。 当Transfer编码被分块时,我不知道该怎么办

是否有一个有用的API或类用于在JAVA中提取数据

如果有人对http解码有经验,请告诉我一种方法如何做到这一点?

Apache


哦,如果我们讨论的是客户端,那么也可以这样做。

使用一个完全值得使用的HTTP客户端,比如Java SE()。两者都以完全透明的方式处理它,并为您提供“正常”的
InputStream
返回。HttpClient反过来还附带了一个,您只需使用它来装饰您的
InputStream


如果您真的坚持在家中为此开发一个库,那么我建议创建一个类,如
ChunkedInputStream扩展InputStream
,并相应地编写逻辑。您可以在中找到如何解析它的更多详细信息。

如果您正在寻找一个简单的API,请尝试Jodd Http库()。 它为您处理分块传输编码,您将整个身体作为字符串返回

从文档中:

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

此实现不提供错误内容格式的详细异常(行号)

它适用于Java8,但在下一版本中可能会失败。你已经被警告过了

不过,这可能对原型设计有用


您可以从中轻松地选择任何
实现。

实际上,我进行了脱机http解码,我只有http数据包的头和体。我会解码数据包。但我需要一个api,它获取头和体,并提供解码数据。有这样的api吗?Wikipedia的文章详细介绍了块的外观。基本上可以在CRLF上拆分(\r\n)。它是字节10和13。第一部分是标头,它以十六进制表示块长度。第二部分是区块数据本身。您只需收集并连接所有这些块。
ChunkedInputStream
就是这样做的。对不起,这里有两个ChunkedInputStream类第一个:第二个:哪一个适合这个?您有关于如何使用ChunkedInputStream的任何信息吗?我的答案中的
ChunkedInputStream
部分是可点击的(与所有其他蓝色部分一样)。这是一个
InputStream
,你可以用它装饰另一个
InputStream
。例如,
InputStream输入=新的ChunkedInputStream(originalInput)