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

roy*_*g86 5 python http chunked-encoding http-headers

我目前正在编写一个 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 = "\r\n".join(headerList)
        reqData = hostReqHeader + '\r\n\r\n' + qbPosMsg
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*obᵩ 10

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

    headerList.append("POST /v2/charges HTTP/1.0")
Run Code Online (Sandbox Code Playgroud)


tho*_*ter 6

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

当客户端指定 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 仍然可以使用。