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?
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
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.
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'])