web-dev-qa-db-fra.com

Boucle POST demande dans le code pycurl

J'essaie de convertir la requête suivante curl en pycurl:

curl -v
-H Accept:application/json \
-H Content-Type:application/json \
-d "{
    name: 'abc',
    path: 'def',
    target: [ 'ghi' ]
}" \
-X POST http://some-url

J'ai le code python suivant:

import pycurl, json

c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://some-url')
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
data = json.dumps({"name": "abc", "path": "def", "target": "ghi"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
print curl_agent.getinfo(pycurl.RESPONSE_CODE)
c.close()

En exécutant ceci, j'avais une erreur 415: type de média non supporté, alors j'ai changé:

c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])

dans:

c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])

Cette fois, j'ai 400: mauvaise demande. Mais le code bash avec curl fonctionne. Avez-vous une idée de ce que je devrais corriger dans le code python?

9
Konrad

Dans votre exemple bash, la propriété target est un tableau, dans votre exemple Python, il s'agit d'une chaîne.

Essaye ça:

data = json.dumps({"name": "abc", "path": "def", "target": ["ghi"]})

Je vous conseille également fortement de consulter la bibliothèque requests qui possède une API beaucoup plus agréable:

import requests
data = {"name": "abc", "path": "def", "target": ["ghi"]}
response = requests.post('http://some-url', json=data)
print response.status_code
2
Daniel Hepper

Je sais que cela fait plus d'un an maintenant, mais essayez de supprimer les espaces dans la valeur de votre en-tête.

c.setopt(pycurl.HTTPHEADER, ['Accept:application/json'])

Je préfère également utiliser le module de requêtes car les API/méthodes sont propres et faciles à utiliser.

2
Brian

J'ai eu un problème similaire, et j'ai utilisé votre exemple de code mais mis à jour la section httpheader comme suit:

c.setopt(pycurl.HTTPHEADER, ['Content-Type:application/json'])
0
Ashwin Venkat