如果传输编码是分块的,如何使用java获得http响应中的分块大小

如果传输编码是分块的,如何使用java获得http响应中的分块大小,http,response,chunked-encoding,Http,Response,Chunked Encoding,如果传输编码是分块的,如何知道HTTP响应的分块大小。我无法获得逻辑。 请帮助我。并提供一些java代码示例来获取块的大小。我在一些书中读到,每个块的大小都是在块本身之前指定的。但是使用哪种逻辑可以得到它呢。 请帮助我使用java 谢谢。无法提供现成的代码,但Apache HttpClient库支持开箱即用的“一切” 这是维基百科中分块响应的例子。在读取正文部分之前,您不知道数据的确切字节大小。请注意,每个区块的大小是十六进制值,最后一个0大小的区块是数据的结尾。它也由2字节CRLF分隔符终止

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


谢谢。

无法提供现成的代码,但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大小,请重新读取大小+区块数据
  • 有些响应可能会添加AfterHeader,它们类似于响应开头的标题
  • 在0大小的块之后,一个空行(\r\n)表示完成http响应的结束。如果没有AfterHeader,您应该在末尾看到字节0\r\n\r\n。请注意,常规块可能包含空行,因此在0大小的指示符之前不要终止解析

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

谢谢..但我在一个页面中发现chunk_size=int(line.strip().split(“;”)[0],16)我不理解此行。他们给出了查找chunk size的逻辑。但是[0]是什么索引以及放置16的原因。我不理解此语句。请您帮助我。“5;extkey=extvalue”。拆分(;)给出了一个由两个元素组成的数组[0]=“5”,“1]=“extkey=extvalue”。int(arr[0],16)将第一个字符串元素转换为整数值,请注意块的大小是十六进制的,这就是为什么指示符是16。如果行没有扩展名(;),split只返回一个大小的数组,strotInteger转换仍然有效。上面的逻辑,即int(arr[0],16)直接给出了看起来以字节为单位的块大小。是否正确??int(arr[0],16)函数将十六进制字符串转换为整数值。它是属于下一个块的数据字节数。是4表示“Wiki”字节,5表示“pedia”字节。请注意\r\n每行末尾的终止符字节,它们不包括在块大小中。你只需要知道在每一行尾有两个“隐藏”字节。“E”十六进制的大小是14个字节。在\r\n\r\n chunks中。块数据中的新行与任何数据字节一样。根据上面的示例,我首先需要读取4\r\n,然后将4转换为整数。转换后,如果它给出了一些值,比如X,那么我必须读取X字节并附加到ByteArrayOutputBuffer。这意味着这次我正在阅读“Wiki”,对吗?我应该阅读“wiki”后面的\r\n内容并忽略它。然后再次阅读5\r\n,依此类推。类似的过程将继续,直到我得到0为止。这是获取分块数据的方法吗?我说的对吗?请回答。谢谢。