Python 的 HTTP 请求和响应是如何工作的

6 投票
3 回答
32931 浏览
提问于 2025-04-15 21:29

我刚开始学习Python,正在做一个任务,需要扫描WiFi并把数据发送到服务器。下面是我需要发送的数据格式,当我在浏览器的地址栏手动输入时,这个格式可以正常工作。

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 个回答

0

错误信息不是来自你粘贴的那段代码。

在错误信息中,有一行:

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

这是http.py文件的第9行,但这行代码并不在你粘贴的代码里。

请粘贴实际的代码。

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)

我不确定这样做是否能解决你所有的问题,但至少你的代码会符合方法或构造函数的要求。

10

你提到的脚本问题,很可能是因为你不能直接这样做:

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

错误是在getaddrinfo()这个函数里触发的,它调用了C语言的一个函数getaddrinfo(),这个函数返回了一个错误代码EAI_NONAME

节点或服务未知;或者节点和服务都是空的;或者在提示中指定了AI_NUMERICSERV,但服务不是一个数字端口号字符串。

显然,你传给getaddrinfo的参数有问题,很可能你是想获取"223.56.124.58:8080/wireless"这个主机的信息。哎呀!

实际上,你不能直接连接到一个网址。正如文档中明确说明的那样,你应该连接到服务器

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发送POST请求。你真正想要的可能是:

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'

撰写回答