2

我正在尝试将来自 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。

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

4

3 回答 3

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配置或试图读取参数的代码。

于 2010-07-16T16:40:55.827 回答
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请求一样)是值得商榷的。

于 2010-07-16T18:28:02.463 回答
1

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

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

于 2010-07-16T16:44:39.360 回答