簡體   English   中英

重新創建curl命令,使用Python請求將JSON作為多部分/表單數據發送

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM