繁体   English   中英

Python 使用请求 cURL 上传文件

[英]Python using Requests to cURL a file upload

我正在尝试将特定的 curl 方法转换为 Python 的请求模块,以将文件上传到 api。 我适用于非文件请求的标准方法如下所示:

import requests

requestObject = requests.Session()
standard_headers = {header1:headerValue1,header2:headerValue2}
payload = {key1:value1,key2:value2}
url = 'https://myUrl.com/apiCall'

requestObject.post(url,headers=standard_headers, json=payload)

这适用于我需要向 API 发出的非文件请求。 但是对于文件上传,API 文档显示了使用 curl 的方法:

curl -XPOST -H 'header1' -H 'header2 'https://myUrl.com/apiCall' \
  -F 'attachment=@/path/to/my/file' \
  -F '_json=<-;type=application/json' << _EOF_
  {
    "key1":"keyValue1",
    "key2":"keyValue2"
  }
_EOF_

我测试了 curl 命令,它运行成功。

我的问题是如何使用 Python 请求中的<< _EOF_方法翻译 curl 方法。 我的一个想法是简单地使用requests模块中的“文件”选项:

requestObject = requests.Session()
standard_headers = {header1:headerValue1,header2:headerValue2}
payload = {key1:keyValue1,key2:keyValue2}
url = 'https://myUrl.com/apiCall'
file_to_upload = {'filename': open('/path/to/my/file', 'rb')}

requestObject.post(url,headers=standard_headers, files=file_to_upload, json=payload)

但这似乎不起作用,因为必要的 json 参数( payload中的值)似乎没有传递给文件上传

我还尝试将 json 参数直接指定到file_to_upload变量中:

requestObject = requests.Session()
standard_headers = {header1:headerValue1,header2:headerValue2}
url = 'https://myUrl.com/apiCall'
file_to_upload = {'attachment': open('/path/to/my/file', 'rb'),'{"key1":"keyValue1","key2":"keyValue2"}'}

requestObject.post(url,headers=standard_headers, files=file_to_upload)

类似的结果,似乎我没有正确传递必要的 json 值。 我尝试了其他一些方法,但我忽略了一些东西。 任何关于我应该如何构建我的请求的见解都值得赞赏。

好的,我设法让它工作并为将来可能需要帮助的任何人发布。

诀窍是在数据字段中包含_json键。 我的代码最终看起来像这样:

import requests

requestObject = requests.Session()
standard_headers = {header1:headerValue1,header2:headerValue2}
json_fields = json.dumps({ 
                           "key1": "key1Value",
                           "key2": "key2Value"                                              
                         })
payload = {"_json":json_fields)
file = {"attachment": /path/to/my/file} 
url = 'https://myUrl.com/apiCall'

requestObject.post(url,headers=standard_headers, files=file, data=payload)

希望对未来的人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM