首页 > 解决方案 > Python 获取 http 预告片

问题描述

如何使用 python 获取 HTTP 预告片响应标头?我正在使用requests.get,但无法获得某些 X-Content-Type 或 X-Status。但是,当我使用curlwith时-i,我得到了这些响应。我需要发送特定的标头或参数吗?我尝试发送TE: trailers,但它似乎没有做任何事情。

一些示例代码:

import requests

url = "some_api_endpoint"
params = {"param1": "val1"}
headers = {"Accept": "application/json", "TE": "trailers"}

response = requests.get(url, params=params, headers=headers, verify=False)
print("Status: {}".format(response.status_code))
print("Content: {}".format(response.content.decode('utf-8')))
print("Headers: {}".format(response.headers))
print("Reason: {}".format(response.reason))

输出:

Status: 200
Content:
Headers: {'Connection': 'close', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked'}
Reason: OK

卷曲命令

curl -k -i <url>?<params> -H 'Accept: application/json'

输出:

TP/1.1 200 OK
Connection: close
Content-Type: application/json
Transfer-Encoding: chunked

X-Status: Some Error

我想从 python中获取Some Error甚至是上面的标题。X-Status基本上是从服务器获得 200 并且在流式传输一些响应时,它在中间遇到错误,导致错误。不幸的是,我无法在 python 中轻松收到此消息。

标签: pythonhttppython-requestshttp-headers

解决方案


来自https://www.python.org/dev/peps/pep-0444/#request-trailers-and-chunked-transfer-encoding

请求预告片和分块传输编码

当对请求内容使用分块传输编码时,RFC 允许存在请求尾。这些类似于请求标头,但位于最终的空数据块之后。这些预告片仅在分块数据流的长度有限并且已全部读入时才可用。WSGI 和 Web3 目前都不支持它们。

关于requests库,没有比这更好的了:

如前所述,Trailers 是一个很少使用的 HTTP 功能。

实现起来非常复杂(因为您必须确保在此处不解析任何会改变正文大小的标头,例如 Content-Length 和 Transfer-encoding)。

因此,它们实际上是少数实现预告片的解析器,并且现在很少出现在 HTTP 消息中(但你有一个,为你感到抱歉:-))。


推荐阅读