2011-12-26 22 views
18

Sono nuovo di servizi web e sto cercando di inviare la seguente richiesta in base JSON utilizzando uno script python:Invio richiesta JSON con Python

http://myserver/emoncms2/api/post?apikey=xxxxxxxxxxxxx&json={power:290.4,temperature:19.4} 

Se incollo quanto sopra in un browser, funziona come previsto . Tuttavia, sto lottando per inviare la richiesta da Python. Quello che sto provando è:

import json 
import urllib2 
data = {'temperature':'24.3'} 
data_json = json.dumps(data) 
host = "http://myserver/emoncms2/api/post" 
req = urllib2.Request(host, 'GET', data_json, {'content-type': 'application/json'}) 
response_stream = urllib2.urlopen(req) 
json_response = response_stream.read() 

Come aggiungere i dati apikey alla richiesta?

Grazie!

risposta

26

Invece di utilizzare urllib2, è possibile utilizzare requests. Questa nuova lib python è davvero ben scritta ed è più facile e più intuitiva da usare.

per inviare i dati JSON è possibile utilizzare qualcosa come il seguente codice:

import json 
import requests 
data = {'temperature':'24.3'} 
data_json = json.dumps(data) 
payload = {'json_payload': data_json, 'apikey': 'YOUR_API_KEY_HERE'} 
r = requests.get('http://myserver/emoncms2/api/post', data=payload) 

si può quindi ispezionare r per ottenere un codice di stato HTTP, contenuti, ecc

+0

Grazie per la risposta! Esiste un metodo che posso usare per stampare la stringa di richiesta effettiva? Il server sta rispondendo con "valido write apikey richiesto", ma sto usando la stessa chiave che funziona nel browser. –

+0

Sì, è possibile utilizzare un hook di eventi per questo. In realtà i documenti delle richieste contengono un esempio con questo, stampando l'url prima di inviare la richiesta: http://docs.python-requests.org/en/latest/user/advanced/#event-hooks – simao

+0

Ciao Simao, che mi dà la capacità di guardare gli argomenti, ma cosa devo fare per vedere la stringa di richiesta completa effettiva che viene inviata al server, ad esempio http: // myserver/emoncms2/api/post? apikey = xxxxxxxxxxxxx & json = {power : 290.4, temperatura: 19.4} –

1

Forse il problema è che json.dumps mette " e nel json che hai inserito nell'URL non ci sono " s. Per esempio:

data = {'temperature':'24.3'} 
print json.dumps(data) 

stampe:

{"temperature": "24.3"}

e non:

{temperature: 24.3}

come si mette in URL.

Un modo per risolvere questo (che è incline problemi) è quello di fare:

json.dumps(data).replace('"', '') 
+0

Grazie per la risposta.Ho provato a inviare la richiesta nel browser con le virgolette attorno alla chiave e ai valori, e funziona ancora bene. Il problema principale che mi viene in mente è che i dati di apikey non vengono inviati correttamente dal mio script python. –

+0

Come cambiare il tuo codice a questo: 'params = urllib.urlencode ({'apikey': 'xxxxxxx', 'json': {'temperatura': '24.3'}}) \ urllib2.urlopen (host + '?' + parametri) ' – Guy