Python URLLib / URLLib2 POST请求

39 投票
1 回答
117529 浏览
提问于 2025-04-16 01:14

我正在尝试用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 请求。

撰写回答