как работает Python http запрос и ответ - PullRequest
6 голосов
/ 12 апреля 2010

Я новичок в Python, у меня есть задача, поэтому мне нужно отсканировать Wi-Fi и отправить данные на сервер, ниже приведен формат, который я должен отправить, это прекрасно работает, когда введите вручную в тексте браузера URL коробка,

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

вот мой код:

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

спасибо

Ответы [ 3 ]

10 голосов
/ 12 апреля 2010

Скорее всего, проблема со сценарием, который вы разместили в вопросе , заключается в том, что вы не можете напрямую это сделать:

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

Исключение вызывается в getaddrinfo(), который вызывает функцию C getaddrinfo(), которая возвращает EAI_NONAME:

Узел или служба не известны; или и узел, и служба имеют значение NULL; или AI_NUMERICSERV был указан в hints.ai_flags, и служба не была числовой строкой номера порта. "

Очевидно, что есть проблема с параметрами, переданными в getaddrinfo, и, скорее всего, вы пытаетесь получить информацию для хоста "223.56.124.58:8080/wireless". По электронной почте Ой!

Действительно, вы не можете напрямую подключиться к URL-адресу. Поскольку в документации четко указано и показано , вы подключаетесь к серверу :

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

Тогда вы можете сделать:

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

Как насчет сценария, которым вы на самом деле используете ?

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

Даже если соединение было правильно сформировано, вы бы отправили сообщение http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web. Что вы действительно хотите, вероятно, это:

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

Ошибка показывается для этой строки, потому что, скорее всего, HTTPConnection является ленивым объектом и пытается реально подключиться к серверу только при вызове request().


После того, как вы исправите все вышеперечисленное, вам нужно будет исправить 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'

Чтобы получить то, что вы думаете, что хотите получить, вы должны сделать:

>>> 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'
1 голос
/ 12 апреля 2010

Вместо:

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

попробовать:

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

Не уверен, что это решит все ваши проблемы, но по крайней мере ваш код будет соответствовать сигнатурам метода / конструктора.

0 голосов
/ 12 апреля 2010

Трассировка не происходит из того же кода, который вы вставили.

На трассировке ошибок есть строка:

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

Это строка 9 из http.py, однако она не указана в вставленном вами коде.

Пожалуйста, вставьте фактический код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...