2010-04-12 16 views
6

Soy novato para python, estoy teniendo una tarea, así que tengo que escanear wifi y enviar los datos al servidor, el siguiente es el formato que tengo que enviar, esto funciona bien cuando se introduce manualmente en el cuadro de texto URL del navegador,cómo python http solicitud y respuesta funciona

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

+0

Si tiene una nueva pregunta, utilice el botón 'Nueva pregunta'. :) Enlace original de la pregunta: http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source – badp

+0

Secundado. Revertido la edición. –

+0

Necesito ayuda con la generación de respuestas para hacer mi respuesta solo una vez durante el tiempo de vida de la carga de la clase –

Respuesta

10

Lo más probable, la cuestión con el guión que ha escrito en la pregunta es que no se puede directamente hacer:

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

La excepción se dispara en getaddrinfo(), que llama a la función C getaddrinfo() que devuelve 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."

Hay, obviamente, es un problema con los parámetros pasados ​​a getaddrinfo, y lo más probable es que están tratando de obtener inf ion para el host "223.56.124.58:8080/wireless". Ooops!

De hecho, no se puede conectar directamente a una dirección URL. As the documentation clearly states and shows, se conecta al servidor:

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

entonces usted puede hacer:

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

¿Qué hay de el guión está hecho usando?

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

Aunque se formó correctamente la conexión, que tendría que publicar en http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web. Lo que realmente quiere es probable que: Se muestra

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

El error de esta línea porque lo más probable es HTTPConnection un objeto vago y sólo intenta conectarse realidad al servidor cuando se llama request().


Después de terminar la fijación de lo anterior, tendrá que fijar 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 conseguir lo que piensa que desea conseguir, que debe 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' 
+0

hola hermano, yo ' m tengo 1 problema, cuando uso datos del método codificado puedo enviar al servidor, pero cuando uso el método no codificado obtengo un error como Trazabilidad (la última llamada es la última): Archivo "scan.py" , línea 71, en request.add_data (urllib.urlencode (query_args)) de archivos "/usr/lib/python2.6/urllib.py", línea 1254, en urlencode aumento TypeError TypeError: no es un no válido -secuencia de cadena u objeto de mapeo me puedes ayudar fo esto, cambio el código de referencia como se indica más arriba gracias – Apache

+0

Necesito ayuda con la generación de respuestas para hacer que mi respuesta solo una vez durante el tiempo de vida de la carga de la clase –

0

el rastreo no viene desde el mismo código que ha pegado.

En el rastreo de error que 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 ha pegado.

Por favor, pegue el código actual.

+1

Gracias por notar eso. – badp

+0

lo siento nosklo, en realidad estoy probando con códigos de muestra, error al pegar desde diferentes, he editado el código, ¿me pueden ayudar para la publicación http para el parámetro diferente como el formato anterior , gracias – Apache

1

En lugar de:

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

intento:

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

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

Cuestiones relacionadas