cómo funciona la solicitud y respuesta http de Python

Soy novato de python, tengo tareas, por lo que necesito escanear wifi y enviar los datos al servidor, el siguiente es el formato que debo enviar, este trabajo funciona bien cuando se ingresa manualmente en el cuadro de texto de la URL del navegador.

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

Aquí está mi código:

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

Gracias

Lo más probable es que el problema con el script que publicaste en la pregunta es que no puedes hacerlo directamente:

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

La excepción se activa en getaddrinfo() , que llama a la función C getaddrinfo() que devuelve EAI_NONAME :

El nodo o servicio no se conoce; o tanto el nodo como el servicio son NULL; o AI_NUMERICSERV se especificó en hints.ai_flags y el servicio no era una cadena de número de puerto numérica “.

Obviamente, hay un problema con los parámetros pasados ​​a getaddrinfo y lo más probable es que esté intentando obtener información para el "223.56.124.58:8080/wireless" . Ups!

De hecho, no puede conectarse directamente a una dirección URL. Como la documentación indica y muestra claramente , se conecta al servidor :

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

Entonces puedes hacer:

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

¿Qué pasa con el script que realmente estás usando ?

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

Incluso si la conexión se formó correctamente, eso le haría POSTing a http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web . Lo que realmente quieres es probablemente:

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

El error se muestra para esta línea porque lo más probable es que HTTPConnection sea ​​un objeto perezoso y solo intente conectarse al servidor cuando llame a request() .


Una vez que hayas terminado de arreglar lo anterior, necesitarás arreglar los 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' 

Para obtener lo que crees que quieres obtener, debes hacer:

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

En lugar de:

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

tratar:

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

No estoy seguro de si resolverá todos sus problemas, pero al menos su código se ajustará a las firmas del método / constructor.

El rastreo no proviene del mismo código que pegaste.

En la traza de error hay una línea:

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

Es la línea 9 de http.py sin embargo, no está en el código que pegó.

Por favor, pegue el código real.