【问题标题】:What is the correct Content-Length to set for a GET request?为 GET 请求设置的正确 Content-Length 是多少?
【发布时间】:2012-01-22 09:05:56
【问题描述】:

当我使用以下代码发出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 请求的正确 ContentLength 是什么?

【问题讨论】:

    标签: http http-headers httpwebrequest content-length


    【解决方案1】:

    由于您在执行GET 请求时通常不会发送任何其他数据,因此根本不应该发送标头Content-Length。

    只有在发送message-body时才应包含标头Content-Length,并且标头的值始终是该字段的长度,以( OCTETs) 个字节。

    (RFC2616) 14.13 Content-Length

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

    应用程序应该使用该字段来指示消息体的传输长度,除非4.4 部分中的规则禁止这样做。


    在执行 GET 请求时包含 message-body 被认为是不好的做法,但是在读取 HTTP RFC2616 时,我看不到任何说明 GET 请求不能包括一个消息正文。

    虽然我会假设如果您在 message-body 中发送数据并希望在这种情况下对其进行解析和处理,今天大多数 Web 服务器不会回复您希望他们回复的内容。

    (RFC2616) 4.3 Message Body

    HTTP 消息的消息体(如果有)用于携带 与请求或响应关联的实体主体。消息体 仅当传输编码已完成时才与实体主体不同 应用,如 Transfer-Encoding 标头字段所示(部分 14.41)。

       message-body = entity-body
                    | <entity-body encoded as per Transfer-Encoding>
    

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

    消息中何时允许消息正文的规则不同 请求和响应。

    请求中存在消息体由 包含 Content-Length 或 Transfer-Encoding 头字段 请求的消息头。

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

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

    【讨论】:

    • 对此答案的小补充:RFC7231(新的 RFC723x 系列 RFC 的一部分,已淘汰“旧”RFC2616)只是说A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.
    • @Filip 如果你有一个字符串格式的 json 内容,你是否将 "Content-Length" 设置为 json.getBytes("UTF-8") ?我试过了,收到了错误的请求 - 无效的内容长度

      HTTP 错误 400。请求中的内容长度或块长度无效。

    • tools.ietf.org/html/rfc7230 RFC7230 现在明确表示“当请求消息不包含有效负载主体并且方法语义不预期这样的主体时,用户代理不应该发送 Content-Length 标头字段。”
    猜你喜欢
    • 2010-09-07
    • 2016-09-15
    • 1970-01-01
    • 2020-09-21
    • 2018-04-06
    • 2011-08-04
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多