服务请求丢失了参数
Posted
技术标签:
【中文标题】服务请求丢失了参数【英文标题】:Servet request lost the params 【发布时间】:2012-11-13 17:34:43 【问题描述】:与Request parameters are dropped in Tomcat相关的问题
嗯...显然,在某些服务器上,即使是以下最简单的请求也会丢失参数,而有些则可以。
@GET
@Path("/get-retrieve")
public String foo()
return ""+httpServletRequest.getParameterMap().size();
所以返回值为0
(零)。
更新:AccessLogValve记录的请求中包含参数
127.0.0.1 - - [26/Nov/2012:03:04:58 -0800] "POST /api/get-retrieve?x=y HTTP/1.1" 200 16
所以,问题可能出在 Tomcat 中某处抛出这些参数...
【问题讨论】:
这不是人们在 *** 上提问的方式。发布代码和一个损坏的配置,这样我们就可以运行它并找出问题所在。 这是我拥有的全部代码,它是一个丢失参数的简单 GET。我正在寻找帮助和方向,而不仅仅是直接的解决方案。 你是盲人还是什么?日志显示POST /api/get-retrieve HTTP/1.1
。你甚至否决了我的回答。您不断向带有 @GET
注释的方法发送 POST 并询问为什么它不起作用...
日志 'POST' 是复制粘贴错误。它是“得到”
我从未听说过粘贴替换。为什么不在foo()
签名中使用@QueryParam
?
【参考方案1】:
我们遇到了这个问题,结果证明我们允许多个线程访问HttpServletRequest
对象。这是不允许的。它不是线程安全的。
【讨论】:
【参考方案2】:确保你没有将 httpServletRequest 传递给另一个线程。
【讨论】:
【参考方案3】:我曾经遇到过这种情况,经过长时间的调查发现问题出在 Tomcat 的 server.xml 中连接器的定义中:
<Connector connectionTimeout="20000" maxHttpHeaderSize="9000" maxParameterCount="100" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
查看“maxParameterCount”的定义,在我们的例子中它被设置为 0 导致所有请求参数被丢弃。
【讨论】:
【参考方案4】:基于链接问题中发布的代码
wr.type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, multipart);
问题可能是您使用@GET
注释您的方法,但实际上您的客户发出POST
。也许 JAX-RS 的某些实现仍将请求路由到您的方法,但由于方法不匹配而无法提取参数。比较一下 GET 的样子后,算法确实有很大不同:
GET /path/to/resource?id=foobar HTTP/1.1
Host: example.com
还有一个帖子:
POST /path/to/resource HTTP/1.1
Host: example.com
Content-Type: multipart/form-data, boundary=A9zfsdf0x;9ad
--A9zfsdf0x;9ad
content-disposition: form-data; name="id"
foobar
因此,当您设计 RESTful API 时,您应该仔细选择方法,并在客户端和服务器上都使用它。
【讨论】:
嗨,在链接的问题中,POST 转到 POST。在这个小例子中,它是一个由 GET 执行的 GET... 那么如何重现您的问题呢?整个世界都在 JavaEE 上运行的可能性很小,而您发现了一个关于 GET 解析的错误...... 我不确定,我在这里寻求帮助。我办公室有 3 位主机有问题,另外 3 位还可以...以上是关于服务请求丢失了参数的主要内容,如果未能解决你的问题,请参考以下文章