2016-04-10 13 views
0

ben (beklenen tepkiyi mükemmel çalışıyor ve sağlar) Aşağıdaki bukle POST komutunun Python-İstekler sürümünü oluşturmak için çalışıyorum:Python İstekleri kullanarak çok parçalı/form-data olarak JSON gönderir kıvırın komutunu yeniden oluşturun

curl -F 'json={"method":"update_video","params":{"video":{"id":"129263001","itemState":"INACTIVE"},"token":"jCoXH5OAMYQtXm1sg62KAF3ysG90YLagDAdlhg.."}}' https://api.somewebservice.com/services/post 

kullanma:

curl -v -F 'json={"method":"update_video","params":{"video":{"id":"582984001","itemState":"INACTIVE"},"token":"jCoXH5OAMYQtXm1sg62KAF3ysG90YLagEECDAdlhg.."}}' https://api.somewebservice.com/services/post 

alıyorum aşağıdaki (bütün TLS el sıkışma sonra ancak dahil çıkışı, sunucu sertifikası veri, vb):

.... 

> 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 

Yukarıdaki cURL komutunun mükemmel bir şekilde çalıştığını ve bu çıktının burada ayrıntılı modda çalıştığını göz önüne alarak, yapmam gereken şeyin bir formda bir JSON nesnesini gönderen çok parçalı/form yaklaşımı alması gerektiğine inanıyorum. Bunu Python-Requests kullanarak yeniden oluşturmaya çalışıyorum?

Şimdiye kadar, ben denedim: Ben gibi, çok farklı varyasyonlar denedim

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) 

veya olmayan başlıklar şöyle:

r = requests.post(url, data=json.dumps(payload)) 

veya bu:

r = requests.post(url, json=payload) 
Biz bir null var

: belirtiyor

{"error": {"name":"MissingJSONError","message":"Could not find JSON-RPC.","code":211}, "result": null, "id": null} 

o "211" hata için bu web hizmeti belgelerine:

Ve hiçbir şey ben sadece aynı hata mesajıyla, iş gibi görünüyor json parametresi (çoktan olmayan bir yazı için) veya çok parçalı yazının ilk kısmı için dize.

İstekler modülünü kullanarak bu cURL isteğini yeniden oluşturma konusunda burada ne yapıyorum? Yüklenen nesneyi form kodlu veri olarak gönderebileceğimi düşündüm ve cURL komutunun oradaki -F argümanıyla yaptığı gibi görünüyor.

cevap

0

Görünüşe göre bu bukle komut aşağıdaki ile yeniden edilebilir:

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) 

biz yukarıda sadece 'application/json' kullandığınız ile oysa bukle komut başlığındaki 'multipart/form-data' kullandığından oldukça açık değil.

İlgili konular