Python HTTP请求和响应的工作原理

6

我是Python的新手,因为有任务需要扫描WiFi并将数据发送到服务器,以下是我需要发送的格式。手动在浏览器的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()

谢谢


如果您有新的问题,请使用“新问题”按钮。 :) 原始问题链接:http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source - badp
同意。撤销了编辑。 - Marc Gravell
我需要一些关于生成响应的帮助,使我的响应仅在类加载期间生命周期中生成一次。 - DASADIYA CHAITANYA
3个回答

10

很可能,你在问题中发布的脚本的问题是你不能直接执行以下操作:

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

异常在getaddrinfo()中触发,该函数调用C函数getaddrinfo(),后者返回EAI_NONAME

节点或服务未知;或节点和服务均为NULL;或hints.ai_flags指定了AI_NUMERICSERV,而service不是数字端口号字符串。

很明显,传递给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'

嗨兄弟,我有一个问题,当我使用硬编码方法时,数据可以发送到服务器,但是当我使用非硬编码方法时,我会收到以下错误: Traceback (most recent call last): File "scan.py", line 71, in <module> request.add_data(urllib.urlencode(query_args)) File "/usr/lib/python2.6/urllib.py", line 1254, in urlencode raise TypeError TypeError: not a valid non-string sequence or mapping object你能帮我解决这个问题吗?我已经更改了参考代码。谢谢 - Apache
我需要关于响应生成的帮助,使得在类加载期间只生成一次响应。 - DASADIYA CHAITANYA

1

不要:

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
“回溯”不是来自您所粘贴的代码。
在错误回溯中,有一行:
conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers)

这是 http.py 的第9行,但它不在你粘贴的代码中。

请粘贴实际的代码。


抱歉,Nosklo。实际上我正在使用示例代码进行测试,不小心从其他地方复制了代码。我已经编辑过了,你能帮我处理以上格式的不同参数的HTTP POST吗?谢谢。 - Apache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接