我正在使用Spring boot 2.1.3-RELEASE。在我的RestController中,我正在尝试使用一个PathVariable和一个RequestParam(application / 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'
回应是:
{“timestamp”:1553613278534,“status”:400,“error”:“Bad Request”,“message”:“必需的字符串参数'param2'不存在”,“path”:“/ myurl / 42”}
我希望PUT像POST一样工作,但似乎没有。
不幸的是我不能将参数作为QueryParam发送,所以我应该保持相同的请求调用,因为我正在重构一个完全按照这种方式工作的现有端点。
谢谢
我发现这是由使用HandlerInterceptorAdapter(通过WebMvcConfigurer)引起的。由于某种原因,周围
org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues
org.apache.coyote.Request.parameters没有内容并且抛出异常,因此它仅适用于POST而不适用于PUT(GET的处理方式不同)。
我很感激,如果有人可以建议是否可以将此报告为错误,考虑到移除拦截器使其工作。
问候
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编码。 [...]