URL mit enthaltenen Anführungszeichen aus Python aufrufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kalo
User
Beiträge: 3
Registriert: Mittwoch 28. März 2018, 22:49

Guten Abend,

ich versuche schon stundenlang eine URL mit darin enthaltenen Anführungszeichen aus einem Python-Script aufzurufen/zu übergeben, leider ohne Erfolg. Die URL lautet im Original:

Code: Alles auswählen

http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={"Temperatur:":temperature,"Luftfeuchte:":humidity}&apikey=8c635xxxxxxxxx
, wobei natürlich statt temperature und humidity reale Werte drinstehen.

Aufgerufen wird sie im Script so:

Code: Alles auswählen

import urllib
from urllib2 import urlopen

... anderes Zeugs ...

print(temperature, humidity)              
contents = urllib.urlopen("http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={'Temperatur:':temperature,'Luftfeuchte:':humidity}&apikey=8c635xxxxxxxxx") 
Das print ist nur zur Kontrolle eingabaut, ob die Daten auch erkannt werden, was sie auch korrekt werden. Wenn die URL jedoch so wie dargestellt aus dem Script aufgerufen wird, dann motzt die Empfängerseite rum: input_controller.php|{"success": false, "message": "Error decoding JSON string (invalid or too deeply nested)"}
Wenn ich jedoch die original URL über den Browser öffne, dann werden die (dann händisch eingetragenen) Werte korrekt übermittelt, also muss es wohl an der Maskierung der Anführungszeichen liegen, vermute ich mal.
Wie kann die Original-URL aus dem Python-Script heraus korrekt übergeben werden?

Bin für jeden Hinweis, der zur Ergreifung des Fehlers führt, dankbar!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kalo: gültiges JSON braucht Doppelte Anführungszeichen. Warum heißt die URL `post`, Du übergibst aber GET-Parameter?
kalo
User
Beiträge: 3
Registriert: Mittwoch 28. März 2018, 22:49

Hallo Sirius3,
die URL ist so vorgegeben und nur so funktioniert sie ;-)
Ich habe jetzt drüber geschlafen und nachgedacht, und hab es jetzt hinbekommen:

Code: Alles auswählen

contents = urllib2.urlopen("http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={\"Temperatur:\":" + str(temperature) + ",\"Luftfeuchte:\":" + str(humidity) + "}&apikey=8c635e6xxxxxxxxxxx
Und jetzt klappt es ohne Fehler zu werfen und die Daten werden korrekt übergeben :-)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kalo: es gibt 4 verschiedene Methoden um literale Strings anzugeben. Da findet sich immer eine, so dass man Anführungszeichen nicht escapen muß.

Code: Alles auswählen

'http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={"Temperatur:":' + str(temperature) + ',"Luftfeuchte:":' + str(humidity) + '}&apikey=8c635e6xxxxxxxxxxx'
Statt Strings mit + und str zusammenzustückeln, benutzt man Stringformatierung:

Code: Alles auswählen

'http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={"Temperatur:": %s',"Luftfeuchte:": %s}&apikey=8c635e6xxxxxxxxxxx' % (temperature, humidity)
Statt JSON-Daten per Hand zusammenzusetzen, benutzt man json.dumps:

Code: Alles auswählen

data = json.dumps({"Temperatur:": temperature, "Luftfeuchte:": humidity})
'http://192.168.0.22/emoncms/input/post?node=emon01&fulljson={}&apikey=8c635e6xxxxxxxxxxx'.format(data)
Statt Query-Strings von Hand zusammenzusetzen benutzt man urllib.urlencode:

Code: Alles auswählen

data = json.dumps({"Temperatur:": temperature, "Luftfeuchte:": humidity})
'http://192.168.0.22/emoncms/input/post?{}'.format(urllib.urlencode({
    'node': 'emon01',
    'fulljson': data,
    'apikey': '8c635e6xxxxxxxxxxx'
}))
kalo
User
Beiträge: 3
Registriert: Mittwoch 28. März 2018, 22:49

Vielen Dank!! Wird umgehend so umgesetzt und wieder was gelernt! :D
Antworten