我正在使用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'
响应为:
{ “时间戳记”:1553613278534, “状态”:400, “错误”:“错误请求”, “ message”:“不存在必需的字符串参数'param2'”, “路径”:“ / myurl / 42” }
我希望PUT像POST一样工作,但似乎不行。
不幸的是,我无法以QueryParam的形式发送参数,因此我应该维护相同的请求调用,因为我正在重构以这种方式工作的现有端点。
谢谢
我发现这是由于使用HandlerInterceptorAdapter(通过WebMvcConfigurer)引起的。 出于某种原因,
org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues
org.apache.coyote.Request.parameters没有内容,并且会引发异常,因此它仅适用于POST,不适用于PUT(GET的处理方式不同)。
我很高兴有人考虑删除拦截器使其工作,因此是否可以建议将其报告为错误。
致谢
答案 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'
-G
,--get
使用此选项时,会将
-d
,--data
,--data-binary
或--data-urlencode
指定的所有数据用于HTTPGET
请求中POST
请求中的,否则将使用该请求。数据将使用?
分隔符附加到URL。 [...]
--data-urlencode <data>
(HTTP)与其他
-d
,--data
选项类似,它发布数据,但执行URL编码。 [...]