Python与Tomcat之间缺失的PUT变量

2 投票
3 回答
725 浏览
提问于 2025-04-16 01:24

我正在尝试从Python发送一个PUT请求到Tomcat的一个servlet,但在Tomcat中参数缺失。

同样的代码在处理POST请求时运行得很好,但在PUT请求时却不行。

这是客户端的代码:

lConnection = httplib.HTTPConnection('localhost:8080')
lHeaders = {"Content-type": "application/x-www-form-urlencoded",
              "Accept": "text/plain"}
lParams = {'Username':'usr', 'Password':'password', 'Forenames':'First','Surname':'Last'}
lConnection.request("PUT", "/my/url/", urllib.urlencode(lParams), lHeaders)

一旦请求到达服务器,使用request.getParameter("Username")时返回的是null。

有没有人知道我在哪里丢失了这些参数?

3 个回答

2

我不知道你代码里的Tomcat部分是什么样的,也不清楚Tomcat是怎么处理请求参数的。不过我猜,Tomcat并没有“自动”把你PUT请求的内容解析成好用的请求参数。

我在使用App Engine内置的webapp框架(Python)时遇到了同样的问题。它没有把我的PUT请求的内容解析成可以通过self.request.get('param')获取的请求参数,尽管这些内容是以application/x-www-form-urlencoded格式发送的。

不过,你得在Tomcat那边确认一下这个情况。你可能需要自己去获取PUT请求的内容,并手动解析出参数。

至于你的网络框架是否应该像处理POST请求那样,自动解析application/x-www-form-urlencoded格式的PUT请求参数,这个问题是有争议的。

2

我试了你的代码,发现参数确实通过这段代码传到了服务器。Tcpdump的输出是:

PUT /my/url/ HTTP/1.1
Host: localhost
Accept-Encoding: identity
Content-Length: 59
Content-type: application/x-www-form-urlencoded
Accept: text/plain

Username=usr&Password=password&Surname=Last&Forenames=First

所以请求已经正确到达另一端,问题可能出在tomcat的配置上,或者是读取参数的代码上。

1

我在这里猜测一下,但我觉得问题在于PUT这个方法并不是用来那样使用的。PUT的目的是把请求中包含的单个实体存储到头部指定的资源里。那关于用户名之类的东西是怎么回事呢?

你的内容类型是application/X-www-form-urlencoded,这其实是一堆字段内容。PUT想要的是像一个编码过的文件那样的东西。也就是说,它需要的是一整块可以存储的数据。

撰写回答