2011-12-26 22 views
18

Soy nuevo en servicios web y estoy tratando de enviar la siguiente solicitud basada JSON usando un script en Python:Enviando solicitud JSON con Python

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

Si me pega lo anterior en un navegador, funciona como se esperaba . Sin embargo, estoy luchando para enviar la solicitud de Python. Lo siguiente es lo que estoy intentando:

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

¿Cómo agrego los datos apikey en la solicitud?

¡Gracias!

Respuesta

26

En lugar de usar urllib2, puede usar requests. Esta nueva lib de python está muy bien escrita y es más fácil de usar e intuitiva.

Para enviar sus datos JSON se puede usar algo como el siguiente código:

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) 

continuación, se puede inspeccionar r para obtener un código de estado HTTP, contenido, etc.

+0

Gracias por su respuesta! ¿Hay algún método que pueda usar para imprimir la cadena de solicitud de obtención real? El servidor está respondiendo con "apike de escritura válida requerida", pero estoy usando la misma clave que funciona en el navegador. –

+0

Sí, puede usar un gancho de evento para eso. En realidad, las solicitudes contienen un ejemplo con solo eso, imprimiendo la url antes de enviar la solicitud: http://docs.python-requests.org/en/latest/user/advanced/#event-hooks – simao

+0

Hola Simao, eso me da la capacidad de ver los argumentos, pero ¿qué debo hacer para ver la cadena de solicitud completa real que se está enviando al servidor, por ejemplo,'http: // miservidor/emoncms2/api/post? apikey = xxxxxxxxxxxxx & json = {power : 290.4, temperatura: 19.4} –

1

Tal vez el problema es que json.dumps pone " y en el json que pones en la url no hay " s. Por ejemplo:

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

impresiones:

{"temperature": "24.3"}

y no:

{temperature: 24.3}

como usted pone en su URL.

Una forma de resolver este (que es propenso a problemas) es hacer:

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

Gracias por su respuesta.He probado enviar la solicitud en el navegador con las comillas de la clave y los valores, y todavía funciona bien. El principal problema que parece tener es que los datos apikey no se envían correctamente desde mi script python. –

+0

¿Qué le parece cambiar su código a este: 'params = urllib.urlencode ({'apikey': 'xxxxxxx', 'json': {'temperature': '24.3'}}) \ urllib2.urlopen (host + '?' + params) ' – Guy

Cuestiones relacionadas