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

How to tell the HTTP server to not send chunked encoding

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

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

在请求中,我设置了content-length,所以我不确定为什么它仍然向我们发送分块传输编码。我可以在请求中设置任何其他 header 来告诉 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 = "\r\n".join(headerList)
        reqData = hostReqHeader + '\r\n\r\n' + qbPosMsg

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

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

    headerList.append("POST /v2/charges HTTP/1.0")

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

当客户端指定 HTTP/1.1 作为协议时,HTTP/1.1 服务器仅在响应中使用分块传输。如果您想完全禁用分块传输,请在请求中指定 HTTP/1.0 作为协议。

或者,使用支持分块传输的 HTTP 客户端库 - 任何支持 HTTP/1.1 的都可以,因为在任何 HTTP/1.1 对话中,服务器可以自由选择是否对任何请求使用分块传输。

HTTP/1.1(实际上是 HTTP/2)服务器仍然支持 HTTP/1.0,并且 HTTP 1.0 对于编写简单客户端的能力仍然非常有用代码,仍然可以查询现代 Web 服务器(尽管需要 TLS-wrap 来支持 HTTPS)。所以在这种情况下是非常合适的。我认为这就是 HTTP 的优点,基本协议非常简单。 HTTP 1.1 和 HTTP 2.0 在能够编写支持它们的客户端方面逐渐增加了更多的复杂性,但所有这些复杂性都是可选的 - HTTP 1.0 仍然可以使用。