Http 要为GET请求设置的正确内容长度是多少?

Http 要为GET请求设置的正确内容长度是多少?,http,http-headers,httpwebrequest,content-length,Http,Http Headers,Httpwebrequest,Content Length,当我使用以下代码发出POST请求时: string body = "Hello World"; byte[] bytes = Encoding.ASCII.GetBytes(body); WebRequest request = WebRequest.Create("http://internalurl"); request.Method = "POST"; request.ContentLength = bytes.Length; 我将内容长度设置为字节数POSTed。 对于GET请求,正确

当我使用以下代码发出
POST
请求时:

string body = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(body);
WebRequest request = WebRequest.Create("http://internalurl");
request.Method = "POST";
request.ContentLength = bytes.Length;
我将内容长度设置为字节数
POST
ed。
对于
GET
请求,正确的
ContentLength
是什么?

由于在执行
GET
请求时通常不发送任何附加数据,因此不应发送标题
Content Length

只有在发送邮件正文时,才应包括标题
内容长度
,并且所述标题的值始终是此字段的长度,以(八位字节)为单位

Content-Length-entity-header字段表示发送给收件人的实体体的大小(以十进制八位字节为单位),或者在HEAD方法的情况下,表示如果请求是GET,则会发送的实体体的大小

应用程序应使用此字段指示消息正文的传输长度,除非第节中的规则禁止这样做


在执行
GET
请求时包含消息体被认为是一种不好的做法,但在读取HTTP时,我看不到任何东西表明
GET
请求不能包含消息体

尽管我假设,如果您在消息体中发送数据,并且希望在这种情况下对其进行解析和处理,那么今天的大多数web服务器不会回复您希望它们回复的内容

HTTP消息的消息体(如果有)用于承载 与请求或响应关联的实体体。消息体 仅当传输编码已更改时,才与实体体不同 已应用,如传输编码标题字段(第节)所示 14.41)

消息体=实体体
| 
传输编码必须用于指示任何传输编码 由应用程序应用,以确保安全和正确地传输 消息传输编码是消息的属性,而不是实体的属性,因此,任何应用程序都可以在传输过程中添加或删除传输编码 请求/响应链。(但是,第3.6节对 当可能使用某些转移编码时。)

消息中何时允许消息正文的规则因不同而异 请求和答复

请求中存在消息体由 将内容长度或传输编码头字段包含在 请求的消息头

如果请求方法规范(第5.1.1节)不允许在请求中发送实体正文,则请求中不得包含消息正文

服务器应在任何请求时读取和转发消息正文;如果请求方法 不包括实体体的定义语义,则 处理请求时应忽略消息正文


对这个答案的一个小补充:(新的RFC723x系列RFC的一部分淘汰了“旧的”RFC2616)简单地说,
GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
@Filip如果您有字符串格式的json内容,是否将“内容长度”设置为json.getBytes(“UTF-8”)?我试过了,收到了错误的请求-无效的内容长度
HTTP错误400。请求中存在无效的内容长度或区块长度。

RFC7230现在明确表示“当请求消息不包含有效负载正文且方法语义不预期此类正文时,用户代理不应发送内容长度标头字段。”
   message-body = entity-body
                | <entity-body encoded as per Transfer-Encoding>