PUT:PathVariable和RequestParam不能一起使用

时间:2019-03-26 15:13:39

标签: java rest spring-boot put

我正在使用Spring Boot 2.1.3-RELEASE。在我的RestController中,我试图用一个PathVariable和一个RequestParam(应用程序/ x-www-form-urlencoded)设置一个PUT方法。 但是,当我称之为响应时,响应是一个错误的请求,因为所需的RequestParam不存在。

我尝试将PutMapping更改为RequestMapping,交换参数位置并使用语法@RequestParam(value =“ param2”,required = false),但没有任何变化。

好奇地使用PostMapping的作品。还删除了PathVariable作品。

这是RestController代码:

@PutMapping(value="/myurl/{param1}", consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String myMethod( @PathVariable("param1") Integer param1, @RequestParam("param2") String param2);

我以这种方式调用该方法:

curl -X PUT \
  http://localhost:8080/myurl/42 \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'param2=myparam2value'

响应为:

  

{       “时间戳记”:15536​​13278534,       “状态”:400,       “错误”:“错误请求”,       “ message”:“不存在必需的字符串参数'param2'”,       “路径”:“ / myurl / 42”   }

我希望PUT像POST一样工作,但似乎不行。

不幸的是,我无法以QueryParam的形式发送参数,因此我应该维护相同的请求调用,因为我正在重构以这种方式工作的现有端点。

谢谢


编辑

我发现这是由于使用HandlerInterceptorAdapter(通过WebMvcConfigurer)引起的。 出于某种原因,

org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues

org.apache.coyote.Request.parameters没有内容,并且会引发异常,因此它仅适用于POST,不适用于PUT(GET的处理方式不同)。

我很高兴有人考虑删除拦截器使其工作,因此是否可以建议将其报告为错误。

致谢

1 个答案:

答案 0 :(得分:1)

-G一起使用--data-urlencode

curl -G -X PUT \
  http://localhost:8080/myurl/42 \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'param2=myparam2value'

来自documentation

  

-G--get

     

使用此选项时,会将-d--data--data-binary--data-urlencode指定的所有数据用于HTTP GET请求中POST请求中的,否则将使用该请求。数据将使用?分隔符附加到URL。 [...]

  

--data-urlencode <data>

     

(HTTP)与其他-d--data选项类似,它发布数据,但执行URL编码。 [...]