Я - новичок для 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()
спасибо
Скорее всего, проблема со сценарием, который вы разместили в вопросе , заключается в том, что вы не можете сделать это напрямую:
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)
Даже если соединение был правильно сформирован, что приведет к отправке POST на 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'
Отслеживание происходит не из того же кода, который вы вставили.
В трассировке ошибки есть строка:
conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers)
Это строка 9 из http.py
, но ее нет в вставленном вами коде.
Пожалуйста, вставьте фактический код.
Вместо:
conn = httplib.HTTPConnection("http://223.56.124.58:8080/wireless")
conn.request("POST", "data", params, headers)
try:
conn = httplib.HTTPConnection("223.56.124.58", port=8080)
conn.request("POST", "/wireless", params, headers)
Не уверен, решит ли это все ваши проблемы, но, по крайней мере, ваш код будет соответствовать сигнатурам метода/конструктора.