![](/img/trans.png)
[英]Sending authenticated multipart/form-data request using Python Requests
[英]Recreate curl command that sends JSON as multipart/form-data using Python-Requests
我正在嘗試創建以下curl POST命令的Python-Requests版本(它可以正常運行並提供預期的響應):
curl -F 'json={"method":"update_video","params":{"video":{"id":"129263001","itemState":"INACTIVE"},"token":"jCoXH5OAMYQtXm1sg62KAF3ysG90YLagDAdlhg.."}}' https://api.somewebservice.com/services/post
使用方法:
curl -v -F 'json={"method":"update_video","params":{"video":{"id":"582984001","itemState":"INACTIVE"},"token":"jCoXH5OAMYQtXm1sg62KAF3ysG90YLagEECDAdlhg.."}}' https://api.somewebservice.com/services/post
我得到以下信息(僅包括所有TLS握手,服務器證書數據等之后的輸出):
....
> POST /services/post HTTP/1.1
> User-Agent: curl/7.41.0
> Host: api.somewebservice.com
> Accept: */*
> Content-Length: 294
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------871a9aa84d3c0de2
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Content-Length: 1228
< Date: Sun, 10 Apr 2016 07:04:00 GMT
< Server: somewebservice
鑒於上述cURL命令可以正常工作,並且此輸出在此處以詳細模式運行,我是否正確假設我需要做的是采取一種多部分/表單方法,如果我願意,該方法以表單形式發送JSON對象試圖使用Python請求重新創建?
到目前為止,我已經嘗試過:
import requests
import json
def deactivate_request():
url = "https://api.somewebservice.com/services/post"
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
payload = {"method":"update_video","params":{"video":{"id":"12926301","itemState":"INACTIVE"},"token":"jCoXH5OKAF3ysG90YLagEECTP16uOUSg_fEGDAdlhg.."}}
r = requests.post(url, json=payload, headers=headers)
print(r.text)
我也嘗試了不同的變化,例如:
r = requests.post(url, data=json.dumps(payload), headers=headers)
或沒有標題,例如:
r = requests.post(url, data=json.dumps(payload))
或這個:
r = requests.post(url, json=payload)
而且似乎沒有任何效果,我只是不斷收到相同的錯誤消息:
{"error": {"name":"MissingJSONError","message":"Could not find JSON-RPC.","code":211}, "result": null, "id": null}
該Web服務針對“ 211”錯誤的文檔指出:
我們為json參數(對於非多篇文章)或多篇文章的第一部分得到了一個空字符串。
在使用“請求”模塊重新創建此cURL請求方面,我在做什么錯? 我以為我可以將有效載荷對象作為形式編碼的數據發送,並且看起來這就是cURL命令在此處使用-F
參數的方式。
顯然,可以使用以下命令重新創建curl命令:
import requests
def deactivate_request():
url = "https://api.somewebservice.com/services/post"
print url
#headers = {"Authorization": "Bearer " + token, "Content-Type": "application/json"}
headers = {'Content-Type': 'application/json'}
print(headers)
payload = 'json={"method":"update_video", "params":{"video":{"id":"620001", "itemState":"INACTIVE"}, "token":"jCoXH5OAMYQtXm1sg62KAF3yECTP16uOUSg_fEGDAdlhg.."}}'
# using params instead of data because we are making this POST request by
# constructing query string URL with key/value pairs in it.
r = requests.post(url, params=payload, headers=headers)
並不是很明顯,因為curl命令在其標頭中使用'multipart/form-data'
,而對於上面的命令,我們僅使用'application/json'
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.