2010-04-12 17 views
6

Sono novizio per python, sto avendo compito quindi ho bisogno di scansionare wifi e inviare i dati al server, il seguente è il formato che devo inviare, questo funziona bene quando inserire manualmente nella casella di testo del browser URL,funziona come richiesta e risposta http python

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"}} 

ecco il mio codice:

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

grazie

+0

Se hai una nuova domanda, utilizza il pulsante "Nuova domanda". :) Link alla domanda originale: http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source – badp

+0

Secondato. Rilasciata la modifica. –

+0

Ho bisogno di aiuto per la generazione della risposta per rendere la mia risposta una sola volta durante il tempo di vita del carico di classe –

risposta

10

Molto probabilmente, la questione con lo script che avete inviato per la questione è che non si può direttamente fare:

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

L'eccezione viene attivato in getaddrinfo(), che chiama la funzione C getaddrinfo() che restituisce EAI_NONAME:

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."

Ovviamente c'è un problema con i parametri passati a getaddrinfo e molto probabilmente si sta cercando di ottenere informazioni ion per l'host "223.56.124.58:8080/wireless". Ops!

In effetti, non è possibile connettersi direttamente a un indirizzo URL. As the documentation clearly states and shows, ci si connette al server:

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

allora si può fare:

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

Che dire lo script si è realtà utilizzando?

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

Anche se la connessione è stata correttamente formata, che vorrebbero far intervento a http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web. Che cosa si vuole veramente è probabilmente:

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

L'errore viene mostrato per questa linea perché molto probabilmente HTTPConnection è un oggetto pigro e tenta solo per la connessione in realtà al server quando si chiama request().


Dopo aver finito di fissaggio quanto sopra, è necessario correggere params.

>>> 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' 

per ottenere quello che pensa che si vuole ottenere, si dovrebbe fare:

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

ciao fratello, i ' m avendo 1 prob, quando uso i dati del metodo hard-coded posso inviare al server, ma quando uso il metodo non codificato sto ottenendo errore come Traceback (ultima chiamata ultima): File "scan.py" , linea 71, in request.add_data (urllib.urlencode (query_args)) file "/usr/lib/python2.6/urllib.py", linea 1254, in urlencode raise TypeError TypeError: senza un non valido -string sequence or mapping object puoi aiutarmi r questo, cambio il codice per riferimento come sopra grazie – Apache

+0

Ho bisogno di aiuto sulla generazione della risposta per rendere la mia risposta una sola volta durante il tempo di vita del carico di classe –

0

il traceback non proviene dallo stesso codice incollato.

Sul traceback errore c'è una linea:

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

E 'la linea 9 della http.py tuttavia non è sul codice incollato.

Si prega di incollare il codice reale.

+1

Grazie per averlo notato. – badp

+0

scusate nosklo, in realtà sto testando con codici di esempio, errando ho incollato da diversi, ho modificato il codice, potete aiutarmi per il post http per diversi parametri come sopra il formato , grazie – Apache

1

Invece di:

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

prova:

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

sicuro se lo è risolverà tutti i tuoi problemi, ma almeno il tuo codice sarà conforme alle firme metodo/costruttore.

Problemi correlati