簡體   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