2015-08-05 12 views
5

Sto cercando di convertire seguente richiesta ricciolo in pycurl:Curl Inserisci richiesta in codice pycurl

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

Ho seguente codice python:

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() 

L'esecuzione di questo ho avuto un errore 415: Non supportato tipo di supporto, quindi ho cambiato:

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

in:

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

Questa volta ho 400: Richiesta non valida. Ma il codice bash con arricciatura funziona. Hai idea di cosa dovrei risolvere nel codice Python?

risposta

1

Nell'esempio di bash, la proprietà target è una matrice, nell'esempio Python è una stringa.

Prova questa:

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

Ho anche consigliamo vivamente di controllare la biblioteca requests che ha un API molto più bello:

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

La libreria delle richieste è interrotta in molti modi da essere inutile per qualsiasi server che sia rigoroso o leggermente non conforme. Ci sono richieste che funzionano perfettamente con il ricciolo, ma che vengono rifiutate quando vengono fatte con la libreria delle richieste a causa della sua inutile disinfezione. – Nimrod

+0

@Nimrod grazie per il tuo commento. Non ero a conoscenza di ciò e non ho mai avuto problemi con le richieste, ma sarei interessato a saperne di più sui problemi che descrivi. Puoi indicarmi ulteriori informazioni? –

-3

E 'meglio semplice da usare richieste biblioteca. (http://docs.python-requests.org/en/latest)

Applico il codice Python per le intestazioni personalizzate dell'arricciatura originale.

import json 
import requests 

url = 'http://some-url' 
headers = {'Content-Type': "application/json; charset=xxxe", 'Accept': "application/json"} 
data = {"name": "abc", "path": "def", "target": ["ghi"]} 
res = requests.post(url, json=data, headers=headers) 
print (res.status_code) 
print (res.raise_for_status()) 
+2

Si prega di spiegare perché è meglio –

2

So che questo ha più di un anno ora, ma per favore prova a rimuovere lo spazio bianco nel valore dell'intestazione.

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

anche io preferisco usare il modulo richieste anche perché le API/metodi sono pulito e facile da usare.