我应该如何将文本/纯数据传递给 python 的 requests.post?

qme*_*eus 5 python http python-3.x python-requests

我试图curl在 python 请求中转换这个命令,但我不确定我应该如何传递数据:

curl -X POST -u "apikey:{apikey}" \
    --header "Content-Type: text/plain" \
    --data "some plain text data" \
    "{url}"
Run Code Online (Sandbox Code Playgroud)

我试图直接传递字符串并对其进行编码,str.encode('utf-8')但出现错误 415Unsupported Media Type

这是我的代码:

text = "some random text"
resp = requests.post(url, data=text, headers={'Content-Type': 'text/plain'}, auth=('apikey', self.apikey))
Run Code Online (Sandbox Code Playgroud)

[编辑]:解决方案是不在请求中指定标头

非常感谢!

Iva*_*dov 5

使用requests库时,通常最好不要Content-Type使用headers=关键字手动设置标题。

requests如果需要,将为您设置此标头(例如,发布 JSON 将始终导致Content-Type: application/json标头)。

不手动设置此类标头的另一个原因是编码,因为有时您应该指定类似Content-Type: text/plain; charset=utf-8.

更重要的一点Content-Type是,发出 POST 请求不需要此标头。RFC 2616

任何包含实体主体的 HTTP/1.1 消息都应该包含一个 Content-Type 头字段,用于定义该主体的媒体类型。当且仅当 Content-Type 字段未给出媒体类型时,接收者可以尝试通过检查其内容和/或用于标识资源的 URI 的扩展名来猜测媒体类型。如果媒体类型仍然未知,则接收者应该将其视为类型“application/octet-stream”。

因此,根据您向其发出请求的服务器类型,此标头可能会留空。


抱歉这个解释有点含糊。除非您提供目标 URL,否则我无法准确解释为什么这种方法对您有用。

  • 如果您向“data”参数提供“str”或“bytes”数据,则不会自动设置“Content-Type”标头。 (4认同)