Python URLLib / URLLib2 POST请求
我正在尝试用wx/Python创建一个超级简单的虚拟输入/输出板。我已经写了一段代码,用来向服务器发送请求,服务器会存储数据:
data = urllib.urlencode({'q': 'Status'})
u = urllib2.urlopen('http://myserver/inout-tracker', data)
for line in u.readlines():
print line
这段代码没什么特别的。我的问题是,根据我对文档的理解,这应该是一个POST请求,因为我提供了数据参数,但实际上并没有发生这样的请求。我在这个网址的索引中有这段代码:
if (!isset($_POST['q'])) { die ('No action specified'); }
echo $_POST['q'];
每次我运行我的Python应用时,控制台上都会打印出“没有指定操作”的文字。我打算尝试使用请求对象来实现,因为我看到了一些包含这些对象的示例,但我想知道有没有人能帮我解释一下,为什么我的代码没有发送POST请求。谢谢!
-- 更新 --
这段代码确实有效,并且能够正确地向我的网页发送POST请求:
data = urllib.urlencode({'q': 'Status'})
h = httplib.HTTPConnection('myserver:8080')
headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}
h.request('POST', '/inout-tracker/index.php', data, headers)
r = h.getresponse()
print r.read()
我仍然不明白为什么当我提供数据参数时,urllib2库不发送POST请求——在我看来,文档上应该是这样说明的。
1 个回答
47
u = urllib2.urlopen('http://myserver/inout-tracker', data)
h.request('POST', '/inout-tracker/index.php', data, headers)
如果你使用路径 /inout-tracker
而没有在后面加上一个 /
,服务器就不会直接找到 index.php
文件。相反,服务器会发出一个 302
的重定向,让你去访问带有 /
的那个版本。
而这个 302
重定向通常会导致客户端把原本的 POST 请求变成 GET 请求。