CXF在@GET请求中处理像@QueryParams这样的@FormParams的行为是否违反了JAX-RS规范?

时间:2017-10-18 01:41:53

标签: jax-rs cxf

我的公司浪费了一些严肃的工程时间来跟踪与JAX-RS @FormParam方法上的@GET相关的问题。我的想法是,这应该 - 根据定义 - 根本不起作用,因为表单参数应该以x-www形式传输 - urlencoded 请求正文,并且根据RFC 7231第4.3节。 1,请求主体“在GET请求消息中没有定义的语义”,并且应该被服务器忽略。

但是,我们发现 - 至少在CXF中@FormParam@GET的行为与@QueryParam的行为方式相同!经过多次讨论和研究,我在CXF documentation

中看到了这一段
  

请注意,如果请求正文已被使用,则使用@FormParam注释标记的参数可以获取查询参数中的值。这是在JAX-RS规范中定义的,因为过滤器(Spring安全等)消耗了主体,因此JAX-RS表单参数变空。用户可以选择通过将“set.form.parameters.from.http.parameters”message属性设置为false来停用标准行为。

我假设对JAX-RS的引用指向规范中的第11.1节,其中声明:

  

Servlet过滤器可以通过访问请求参数来触发请求体的消费。在servlet中   容器@FormParam注释和application / x-www-form的标准实体提供者 - urlencoded必须从servlet请求参数中获取它们的值,如果请求体已经   被消耗了Servlet API不区分请求的URI和主体中的参数   基于URI的查询参数可以包含在实体参数中。

现在我的问题是: CXF在@FormParam请求中处理@QueryParam s @GET s的行为是否违反了JAX-RS规范?

JAX-RS规范要求从请求参数中获取@FormParam值,“如果请求主体已被使用”。在GET请求中,首先没有请求消息体,所以我想说这个语句根本不适用于GET请求。

作为一个小的后续问题,我也很好奇是否有人可以澄清当规范声明“Servlet API不区分URI中的参数和请求正文时的意思所以 基于URI的查询参数可以包含在实体参数“ - 我知道的servlet API可以很好地区分URI中的信息(即HttpServletRequest.getQueryString())与正文中的信息(即{{1} })。

0 个答案:

没有答案