【问题标题】:Python requests: Use of different body type parameters in post requestPython 请求:在 post 请求中使用不同的正文类型参数
【发布时间】:2017-03-10 03:35:25
【问题描述】:

阅读Python的requests库的documentation,基本请求函数的API有几个看起来多余的参数:

data --(可选)字典或元​​组列表 [(key, value)](将被形式编码)、字节或类似文件的对象在请求正文中发送。

json --(可选)要在请求正文中发送的 json 数据。

files --(可选)'name'字典:文件类对象(或{'name': file-tuple})用于多部分编码上传。文件元组可以是 2 元组('filename',fileobj),3 元组('filename',fileobj,'content_type')或 4 元组('filename',fileobj,'content_type',custom_headers),其中 'content-type' 是定义给定文件的内容类型的字符串,而 custom_headers 是一个类似 dict 的对象,其中包含要为文件添加的附加标头。

界面的其余部分也是如此,例如 post、get 等。我觉得这有点令人困惑。

假设我正在尝试将文件连同有关如何使用它们的说明一起发送到某个端点。我/是否有任何理由不将所有内容都塞入数据参数中,而不是使用文件、json 等?

换句话说,有什么区别:

requests.post('http://some.api.endpoint', 
data={'command': 'foo', 
'options': {'the_thing':'gimmie', 'the_answer': 42}, 
'the_file': open('myfile.pdf', 'rb')})

requests.post('http://some.api.endpoint', 
data={'command': 'foo'}, 
json=json.dumps({'options': {'the_thing':'gimmie', 'the_answer': 42}}), 
files={'the_file': open('myfile.pdf', 'rb')})

对文档中引用的部分最自然的解读是这两个调用是等价的......?

也许我误读了 data 参数的文档,它不能使用文件字典?我有点不清楚。 data 的文档解释是指“字典或列表[三元组、字节或类似文件的对象[s]],还是表示“[字典或元组列表]、字节或类似文件的对象?要么在语法上有点不舒服。

【问题讨论】:

  • 在我看来,这意味着“(字典)或(元组列表),或(字节),或(其他)”。

标签: python post


【解决方案1】:

使用files 参数声明“用于多部分编码上传”。使用 data 参数时,多部分 http 响应不是默认的,因此两者不等价。见What is http multipart request? 具体来说,使用files 参数会生成multipart/form-data POST,而不是application/x-www-form-urlencoded

【讨论】:

  • 哦,这更有意义。我曾假设如果它允许文件和数据,那么多部分请求将是默认的......
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2023-04-09
  • 2014-02-03
  • 2011-12-16
  • 2022-01-01
相关资源
最近更新 更多