2011-12-26 22 views
18

Jestem nowym do usług internetowych i próbuję wysłać następującą prośbę oparciu JSON przy użyciu skryptu Pythona:Wysyłanie żądania JSON Pythona

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

Gdybym wklej powyżej w przeglądarce, to działa zgodnie z oczekiwaniami . Jednak staram się wysłać żądanie z Python. Oto, co próbuję:

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

Jak dodać dane apikey do wniosku?

Dziękujemy!

Odpowiedz

26

Zamiast używać urllib2, można użyć requests. Ta nowa biblioteka python jest naprawdę dobrze napisana i jest łatwiejsza w użyciu.

Aby wysłać dane json można użyć coś podobnego do następującego kodu:

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) 

Można wtedy wglądu r aby uzyskać kod stanu HTTP, treści itp

+0

Dzięki za odpowiedź! Czy istnieje metoda, której można użyć do wydrukowania faktycznego ciągu żądania pobierania? Serwer odpowiada "wymaganą poprawną aplikacją zapisu", ale używam tego samego klucza, który działa w przeglądarce. –

+0

Tak, możesz użyć haka zdarzeń. W rzeczywistości dokumentacja żądań zawiera przykład właśnie tego, drukowanie adresu URL przed wysłaniem żądania: http://docs.python-requests.org/en/latest/user/advanced/#event-hooks – simao

+0

Witaj, Simao, to daje mi możliwość spojrzenia na argumenty, ale co muszę zrobić, aby zobaczyć faktyczny ciąg pełnych żądań, które są wysyłane na serwer, np. http: // myserver/emoncms2/api/post? apikey = xxxxxxxxxxxxx & json = {moc : 290.4, temperatura: 19.4} –

1

Może problemem jest to, że json.dumps umieszcza ", a w jsonie umieszczonym w adresie URL nie ma " s. Na przykład:

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

drukuje:

{"temperature": "24.3"}

a nie:

{temperature: 24.3}

jak można umieścić w adresie URL.

Jednym ze sposobów rozwiązania tego (co jest problemem podatne) to zrobić:

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

Dziękuję za odpowiedź.Przetestowałem wysyłanie żądania w przeglądarce z cytatami na temat klucza i wartości i nadal działa poprawnie. Głównym problemem wydaje się być to, że dane apikey nie jest poprawnie przesyłane z mojego skryptu Pythona. –

+0

Co powiesz na zmianę kodu na: 'params = urllib.urlencode ({'apikey': 'xxxxxxx', 'json': {'temperatura': '24.3'}}) \ urllib2.urlopen (host + "?" + params) ' – Guy

Powiązane problemy