【问题标题】:How should I pass text/plain data to python's requests.post?我应该如何将文本/纯数据传递给 python 的 requests.post?
【发布时间】:2019-08-12 08:56:09
【问题描述】:

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

curl -X POST -u "apikey:{apikey}" \
    --header "Content-Type: text/plain" \
    --data "some plain text data" \
    "{url}"

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

这是我的代码:

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

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

非常感谢!

【问题讨论】:

  • 通常情况下,import requests text = "some random text" resp = requests.requests("POST",url, data=text.encode('utf-8'), headers={'Content-Type': 'text/plain'}, auth=('apikey', self.apikey)) 应该可以工作。但这通常取决于目标。如果您提供要发布此数据的目标,也许我们可以直接尝试
  • 不要在requests中手动设置headersContent-Type
  • 谢谢@IvanVinogradov,虽然我仍然对设置标题不起作用感到惊讶,但这就像一个魅力
  • @IvanVinogradov,你能把这个作为答案发布吗? (最好有简短的解释,但有答案总比没有好)
  • 好的,我会发帖

标签: python python-3.x http python-requests


【解决方案1】:

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

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,否则我无法准确解释为什么这种方法对您有效。

【讨论】:

  • 如果您将strbytes 数据提供给data 参数,则不会自动设置Content-Type 标头。
猜你喜欢
  • 2019-12-26
  • 2012-08-06
  • 2010-09-27
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多