2

如果传输编码被分块,如何知道 HTTP 响应块的大小。我无法获得逻辑。请帮助我。并提供一些示例 java 代码来获取块的大小。我在一些书中读到,每个块的大小是在块本身之前指定的。但是使用哪种逻辑我可以得到它。请帮助我使用java。

谢谢你。

4

1 回答 1

5

无法提供现成的代码,但 Apache HttpClient 库支持开箱即用的“一切”。

这是分块响应的维基百科示例。在读取正文部分之前,您不知道数据的确切字节大小。请注意每个块的大小是十六进制值,最后一个 0 大小的块是数据的结尾。它也由 2 字节的 CRLF 分隔符终止。

Transfer-Encoding: chunked\r\n
Content-Type: text/plain\r\n
\r\n
4\r\n
Wiki\r\n
5;extkey=extvalue\r\n
pedia\r\n
E\r\n
.in\r\n
\r\n
chunks.\r\n
0\r\n
AfterBodyHeader: some value\r\n
AfterBodyHeader2: any value\r\n
\r\n
  • 读取字节直到 CRLF(\r\n 或 0D0A 十六进制)
  • 之后放下一切;分隔符或在尾随 CRLF 处停止,一些回复可能会在块大小的行处添加扩展名。除非您等待已知的键值对,否则请忽略它们。
  • 将十六进制转换为整数,它会告诉您块中的数据字节数
  • 读取 x 字节数并附加到 ByteArrayOutputBuffer
  • 读取尾随 CRLF 分隔符字节并忽略它
  • 如果不是 0 大小,则再次读取 size+chunk 数据
  • 一些响应可能会添加AfterHeaders它们就像响应开头的标题
  • 在 0 大小的块之后,一个空行 (\r\n) 表示完整的 http 响应结束。如果没有AfterHeaders,您应该在最后看到字节 0\r\n\r\n。请注意,常规块可能包含空行,因此在 0 大小的指示符之前不要终止解析。

此示例使用 \r\n 占位符来指示规范要求的 2 字节分隔符

于 2013-05-09T11:02:42.790 回答