PUT变量在Python和Tomcat之间缺失

时间:2010-07-16 16:29:23

标签: python http tomcat put

我正在尝试从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 个答案:

答案 0 :(得分: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 :(得分:2)

我不知道代码的Tomcat端是什么样的,或Tomcat如何处理并提供对请求参数的访问,但我猜测Tomcat不是“自动”解析PUT的主体请求为您提供良好的请求参数。

我在App Engine上使用内置的webapp框架(在Python中)遇到了完全相同的问题。它没有将我的PUT请求的主体解析为通过self.request.get('param')提供的请求参数,即使它们以application/x-www-form-urlencoded的形式进入。

但是,您必须检查Tomcat方面以确认这一点。您可能最终必须访问PUT请求的正文并自行解析参数。

您的Web框架是否应该在application/x-www-form-urlencoded请求中自动解析PUT个参数(与POST请求一样)是值得商榷的。

答案 2 :(得分:1)

我在这里猜测,但我认为问题在于PUT并不意味着以这种方式使用。 PUT的目的是将请求中包含的单个实体存储到标头中指定的资源中。有关用户名和内容的所有内容是什么?

您的内容类型为application/X-www-form-urlencoded,这是一堆字段内容。 PUT想要的是类似编码文件的东西。你知道,它可以存储在一个地方的一大堆数据。