如何告诉HTTP服务器不发送分块编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何告诉HTTP服务器不发送分块编码相关的知识,希望对你有一定的参考价值。

我目前正在编写HTTP客户端,以便在返回HTTP响应的URL上执行HTTP POST。

但是,对于错误消息代码400和500,它发送回非分块的HTTP响应,对于成功消息201,它发送分块响应。

在请求中,我正在设置内容长度,所以我不确定为什么它仍然向我们发送分块传输编码。我可以在请求中设置任何其他标头,这将告诉HTTP服务器不发送分块编码吗?

        headerList.append("POST /v2/charges HTTP/1.1")
        headerList.append("Content-Type: application/json")
        headerList.append("host: xxxxxxxxx")
        headerList.append("request-id: ABCD001123")
        headerList.append("Content-length: %d" %len(Msg))
        hostReqHeader = "
".join(headerList)
        reqData = hostReqHeader + '

' + qbPosMsg

我使用套接字发送这些HTTP消息,而不是使用httplib或请求库。

答案

Chunked是HTTP / 1.1的必需功能。如果您不需要任何其他1.1特定功能,请在您的请求中指定HTTP / 1.0:

    headerList.append("POST /v2/charges HTTP/1.0")
另一答案

您在请求中指定的Content-Length标头适用于请求,而不是服务器的响应。

Chunked transfer-encoding从不用于HTTP请求,仅用于响应,并且仅在客户端指定HTTP / 1.1作为协议时使用。

如果您的客户端无法支持分块响应,只需在请求中指定HTTP / 1.0作为协议(在代码中将HTTP/1.1替换为HTTP/1.0)。

使用HTTP 1.0仍然没有错。 HTTP 1.0对于使用几行代码编写简单客户端的能力仍然非常有用,它仍然可以查询所有现代Web服务器。所以在这种情况下这是非常合适的。我认为这就是HTTP之美,基本协议非常简单。 HTTP 1.1和HTTP 2.0在能够编写支持它们的客户端方面逐渐增加了复杂性,但所有这些复杂性都是可选的 - 仍然可以使用HTTP 1.0。

以上是关于如何告诉HTTP服务器不发送分块编码的主要内容,如果未能解决你的问题,请参考以下文章

用于分块编码 POST 的 HTTP 标头 - 错误 411

如何使用 Proxygen 和 Folly 发送 HTTP 分块响应以模拟视频流?

HTTP协议之chunk编码(分块传输编码)

java中的分块http解码?

HTTP中分块编码(Transfer-Encoding: chunked)

如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码