【发布时间】: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]],还是表示“[字典或元组列表]、字节或类似文件的对象?要么在语法上有点不舒服。
【问题讨论】:
-
在我看来,这意味着“(字典)或(元组列表),或(字节),或(其他)”。