PUT:PathVariable和RequestParam不能一起工作

问题描述 投票:4回答:1

我正在使用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”:15536​​13278534,“status”:400,“error”:“Bad Request”,“message”:“必需的字符串参数'param2'不存在”,“path”:“/ myurl / 42”}

我希望PUT像POST一样工作,但似乎没有。

不幸的是我不能将参数作为QueryParam发送,所以我应该保持相同的请求调用,因为我正在重构一个完全按照这种方式工作的现有端点。

谢谢


EDIT

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

org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues

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

我很感激,如果有人可以建议是否可以将此报告为错误,考虑到移除拦截器使其工作。

问候

java rest spring-boot put
1个回答
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编码。 [...]

© www.soinside.com 2019 - 2024. All rights reserved.