ChatGPT解决这个技术问题 Extra ChatGPT

HTTP 标头中的“Content-Length”字段是什么?

这是什么意思?

在标头中指定编码的编码内容字符串的字节数。内容字符串的字符数。

特别是在 Content-Type: application/x-www-form-urlencoded 的情况下。


T
Tom Cabanski

它是请求或响应正文中的数据字节数。正文是标题下方空行之后的部分。


而不是“请求或响应”,它不是“响应的主体”吗?请求的标头和数据之间没有空行。
我可以更改在 java 过滤器中归档的 HTTP 响应标头内容长度吗
@ajfbiw.s 考虑一个 http post 请求。 “请求中消息体的存在是通过在请求的消息头中包含 Content-Length 或 Transfer-Encoding 头字段来表示的。”来自 w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
Q
Quentin

rfc2616

Content-Length entity-header 字段指示发送给接收者的实体主体的大小,以十进制的八进制数表示,或者在 HEAD 方法的情况下,将发送的实体主体的大小具有请求是 GET。

内容类型是什么并不重要。

post below 处的扩展。


将此答案与 Tom Cabanski 的答案结合起来,您将获得所需的所有信息。如果是文本,您可以计算字符数,因为 ASCII 是 8 位。
@hcpl:但文本不一定总是 ASCII,ASCII 也是 7 位,而不是 8 位。
用您使用的任何编码替换 ASCII 并查找编码所需的位数。对于 7 对 8 位响应;最初它确实是 7 位,所以你又是对的。但是今天,由于计算机内存的组织方式,大多数(如果不是全部)情况下都使用 8 位。编辑:重读我的答案,我知道你要去哪里。我应该改写我原来的评论。
@hcpl:字节与字符问题很重要的全部原因是由于可变宽度编码(如 UTF-8 和 UTF-16),其中“位数”不固定。
s
spender

Content-Length 标头是一个数字,表示 HTTP 正文的确切字节长度。 HTTP 正文在开始行和标题之后找到的第一个空行之后立即开始。

通常,Content-Length 标头用于 HTTP 1.1,以便接收方知道当前响应* 何时完成,因此 connection can be reused for another request.

...或请求,对于具有主体的请求方法,例如 POST、PUT 或 PATCH

或者,可以省略 Content-Length 标头,并且可以使用分块的 Transfer-Encoding header

如果缺少 Content-LengthTransfer-Encoding 标头,则在响应结束时必须关闭连接。

以下资源是我在学习 HTTP 时发现非常有用的指南:

HTTP Made Really Easy


“可以省略 Content-Length 标头,可以使用分块的 Transfer-Encoding 标头”:从字面上拯救了我的一天。太感谢了。
i
itsproject

一个八位字节是 8 位。内容长度是消息正文表示的八位字节数。


@ViniciusPires 'byte' 通常用于描述最小的可寻址内存单元,在所有架构上不一定是 8 位。这就是为什么使用“八位字节”来避免任何歧义
@PJK,不,不是完全正确。 OCTET 这里有一个非常具体的含义,它的意思是<任何 8 位数据序列>。请参阅 w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 中的定义
P
Pacerier

From here

Content-Length entity-header 字段指示发送给接收者的实体主体的大小,以十进制的八进制数表示,或者在 HEAD 方法的情况下,将发送的实体主体的大小具有请求是 GET。 Content-Length = "Content-Length" ":" 1*DIGIT 一个例子是 Content-Length: 3495 应用程序应该使用这个字段来指示消息体的传输长度,除非这被第 4.4 节的规则禁止.任何大于或等于零的 Content-Length 都是有效值。第 4.4 节描述了在没有给出 Content-Length 的情况下如何确定消息体的长度。请注意,此字段的含义与 MIME 中的相应定义明显不同,后者是在“消息/外部正文”内容类型中使用的可选字段。在 HTTP 中,只要可以在传输之前确定消息的长度,就应该发送它,除非 4.4 节中的规则禁止这样做。

我的解释是,这意味着“在线”的长度,即*编码的内容的长度


“在线上”,长度会根据压缩而改变,但在压缩之前说长度是正确的。
Content-Length 在 Mac/Linux 等不同类型的机器上会有所不同吗?或者在使用 curl/postman 等不同的客户端时会有所不同...?
假设所有其他条件保持不变(例如编码、压缩等),那么内容长度应该与平台无关。这是来自服务器的标头,因此,假设它不嗅探用户代理并且行为不同,客户端不应该有任何区别。
F
Frank Bollack

来自this page

迄今为止,POST 最常见的用途是将 HTML 表单数据提交给 CGI 脚本。在这种情况下,Content-Type: 标头通常是 application/x-www-form-urlencoded,而 Content-Length: 标头给出了 URL 编码的表单数据的长度(这里是关于 URL 编码的注释)。 CGI 脚本通过 STDIN 接收消息体,并对其进行解码。这是一个典型的表单提交,使用 POST:POST /path/script.cgi HTTP/1.0 From:frog@jmarshall.com User-Agent:HTTPTool/1.0 Content-Type:application/x-www-form-urlencoded Content-Length: 32


C
Community

根据spec

Content-Length entity-header 字段指示发送给接收者的实体主体的大小,以十进制的八进制数表示,或者在 HEAD 方法的情况下,将发送的实体主体的大小具有请求是 GET。 Content-Length = "Content-Length" ":" 1*DIGIT 一个例子是 Content-Length: 3495 应用程序应该使用这个字段来指示消息体的传输长度,除非这被第 4.4 节的规则禁止.任何大于或等于零的 Content-Length 都是有效值。第 4.4 节描述了在没有给出 Content-Length 的情况下如何确定消息体的长度。请注意,此字段的含义与 MIME 中的相应定义明显不同,后者是在“消息/外部正文”内容类型中使用的可选字段。在 HTTP 中,只要可以在传输之前确定消息的长度,就应该发送它,除非 4.4 节中的规则禁止这样做。


b
benjimin

考虑您是否有以下标题:

content-encoding: gzip
content-length: 52098
content-type: text/javascript; charset=UTF-8

内容长度是压缩消息体的大小,以“八位字节”为单位(即以 8 位为单位,对于所有现代计算机来说恰好是“字节”)。

实际消息体的大小可以是其他大小,可能是 150280 字节。

字符数也可以不同,可能是 150231 个字符,因为一些 unicode 字符使用多个字节(注意 UTF-8 是标准编码)。

因此,不同的数字取决于您是否关心传输了多少数据、保存了多少数据或看到了多少符号。当然,不能保证会提供这些标头。


N
Nakilon

Content-Length entity-header 字段指示发送给接收者的实体主体的大小,以十进制的八进制数表示,或者在 HEAD 方法的情况下,将发送的实体主体的大小具有请求是 GET。

内容长度 = "内容长度" ":" 1*DIGIT

一个例子是

内容长度:1024

应用程序应该使用这个字段来指示消息体的传输长度。

在 PHP 中,你会使用这样的东西。

header("Content-Length: ".filesize($filename));

在“Content-Type: application/x-www-form-urlencoded”的情况下,编码数据被发送到指定的处理代理,因此您可以设置要发布的数据的长度或大小。