2010-04-12 13 views
6

Ich bin Neuling für Python, ich habe Aufgabe, also muss ich Wlan scannen und senden Sie die Daten an den Server, das unten ist das Format, das ich senden muss, das funktioniert gut wenn manuell eingeben in Browser-uRL Textfeldwie python http Anfrage und Antwort funktioniert

http://223.56.124.58:8080/ppod-web/ProcessRawData?data={"userId":"2220081127-14","timestamp":"2010-04-12 10:54:24","wifi":{"ssid":"guest","rssi":"80"}} 

hier mein Code:

import httplib 
import urllib 

params = urllib.urlencode('{\"userId\":\"20081127-14\",\"timestamp\":\"2010-04-12 10:54:24\",\"wifi\":{\"ssid\":\"guest\",\"rssi\":\"80\"}}') 

headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"} 
conn = httplib.HTTPConnection("http://223.56.124.58:8080") 
conn.request("POST","ppod-web/ProcessRawData?data=",params,headers) 
response = conn.getresponse() 
print response.status 
print "-----" 
print response.reason 
data = response.read() 
print data 
conn.close() 

dank

+0

Wenn Sie eine neue Frage haben, verwenden Sie bitte die Schaltfläche "Neue Frage". :) Ursprünglicher Fragenlink: http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source – badp

+0

abgeordnet. Rolled die Bearbeitung zurück. –

+0

Ich brauche etwas Hilfe bei der Antwortgenerierung für machen meine Antwort nur einmal während der Lebensdauer der Klasse laden –

Antwort

10

Höchstwahrscheinlich ist die Ausgabe mit dem Skript, das Sie in der Frage gepostet ist, können Sie nicht direkt zu tun:

conn=httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 

Die Ausnahme in getaddrinfo() ausgelöst, die die C-Funktion getaddrinfo() ruft die EAI_NONAME zurückgibt:

The node or service is not known; or both node and service are NULL; or AI_NUMERICSERV was specified in hints.ai_flags and service was not a numeric port-number string."

Offensichtlich gibt es ein Problem mit den Parametern, die an getaddrinfo übergeben werden, und höchstwahrscheinlich versuchen Sie, informat zu erhalten Ion für den "223.56.124.58:8080/wireless" Host. Hoppla!

In der Tat können Sie nicht direkt eine Verbindung zu einer URL-Adresse herstellen. As the documentation clearly states and shows, verbinden Sie mit dem Server:

conn = httplib.HTTPConnection("223.56.124.58", 8080) 

Dann können Sie tun:

conn.request("POST", "wireless", params, headers) 

Was das Skript Sie sind eigentlich mit?

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

Auch wenn die Verbindung korrekt gebildet wurde, das würde Sie http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web haben Posting. Was Sie wirklich wollen wahrscheinlich ist:

conn = httplib.HTTPConnection("202.45.139.58", 8080) 
conn.request("POST", "ppod-web", params, headers) 

Der Fehler für diese Linie gezeigt ist, weil die meisten wahrscheinlich HTTPConnection ein fauler Objekt ist und versucht, nur tatsächlich mit dem Server zu verbinden, wenn Sie request() nennen.


Nachdem Sie die oben fertig sind Fixierung, müssen Sie params beheben.

>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi","80"}}) 
SyntaxError: invalid syntax 
>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi":"80"}}) 
'wifi=%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D' 

zu bekommen, was Sie bekommen Sie wollen denken, sollten Sie tun:

>>> urllib.urlencode({"data": {"wifi":{"ssid":"guest","rssi":"80"}}}) 
'data=%7B%27wifi%27%3A+%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D%7D' 
+0

hallo bro, ich ' m hab 1 prob, wenn ich hartcodierte methode nutze daten an den server senden kann, aber wenn ich keine hartcodierte methode benutze bin ich gettind error als Traceback (letzter Aufruf zuletzt): Datei "scan.py" , Zeile 71, in request.add_data (urllib.urlencode (query_args)) File "/usr/lib/python2.6/urllib.py", Linie 1254 in urlencode Erhöhung Typeerror Typeerror: keine gültige Nicht -String Sequenz oder Mapping-Objekt können Sie mir helfen, fo r dies, ich ändere den Code für die Referenz wie oben danke – Apache

+0

Ich brauche Hilfe bei der Antwort-Generierung für meine Antwort nur einmal während der Lebensdauer der Klasse laden –

0

die Traceback kommt nicht aus dem gleichen Code, den Sie eingefügt.

Auf der Fehlerrückverfolgung gibt es eine Zeile:

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

Es ist die Linie 9 von http.py aber es ist nicht auf dem Code ist, dass Sie eingefügt.

Bitte fügen Sie den tatsächlichen Code ein.

+1

Vielen Dank für die Kenntnis. – badp

+0

Entschuldigung nosklo, eigentlich ich teste mit Beispielcodes, verleugne ich Paste aus verschiedenen, ich habe den Code bearbeitet, können Sie mir helfen für die HTTP-Post für verschiedene Parameter wie oben , danke – Apache

1

Statt:

conn = httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 
conn.request("POST", "data", params, headers) 

Versuch:

conn = httplib.HTTPConnection("223.56.124.58", port=8080) 
conn.request("POST", "/wireless", params, headers) 

Nicht sicher, wenn es löst alle Ihre Probleme, aber zumindest entspricht Ihr Code den Methoden/Konstruktorsignaturen.

Verwandte Themen