我正在尝试从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。
有没有人知道我丢失参数的地方?
答案 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想要的是类似编码文件的东西。你知道,它可以存储在一个地方的一大堆数据。