Java PUT:PathVariable和RequestParam don';我们不能一起工作
我使用的是SpringBoot2.1.3版本。在我的RestController中,我试图用一个PathVariable和一个RequestParam(application/x-www-form-urlencoded)设置一个PUT方法。 但是,当我调用它时,响应是一个错误的请求,因为所需的RequestParam不存在 我尝试将PutMapping更改为RequestMapping,交换参数位置并使用语法@RequestParam(value=“param2”,required=false),但没有任何变化 好奇地使用后期贴图作品。删除PathVariable同样有效 以下是RestController代码:Java PUT:PathVariable和RequestParam don';我们不能一起工作,java,rest,spring-boot,put,Java,Rest,Spring Boot,Put,我使用的是SpringBoot2.1.3版本。在我的RestController中,我试图用一个PathVariable和一个RequestParam(application/x-www-form-urlencoded)设置一个PUT方法。 但是,当我调用它时,响应是一个错误的请求,因为所需的RequestParam不存在 我尝试将PutMapping更改为RequestMapping,交换参数位置并使用语法@RequestParam(value=“param2”,required=false)
@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,
“错误”:“错误请求”,
“消息”:“所需字符串参数'param2'不存在”,
“路径”:“/myurl/42”
}
我希望PUT的工作原理和POST一样,但似乎不是这样
不幸的是,我不能将参数作为QueryParam发送,所以我应该维护相同的请求调用,因为我正在重构一个以这种方式工作的现有端点
谢谢
编辑 我发现这是由于使用HandlerInterceptorAdapter(通过WebMVCConfiguer)造成的。 由于某种原因,在附近
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'内容类型:应用程序/x-www-form-urlencoded'\
--数据urlencode“param2=myparam2值”
从:
-G
,-get
使用此选项时,将使使用-d
、--data
、--data binary
或--data urlencode
指定的所有数据在HTTPGET
请求中使用,而不是在其他情况下使用的POST
请求。数据将被附加到带有?
分隔符的URL。[……]
--数据URL编码
(HTTP)该选项发布数据,与其他-d
,--data
选项类似,但执行URL编码除外。[……]
{id}?选择器={foo}--id->PathParam和foo->RequestParam。我猜你把“RequestParam”和“HTTP请求体”混为一谈了。如果您的'param2'是请求的主体,请删除@RequestParam注释。您可以尝试以下操作:curl-X PUT\\-H'Accept:application/json'\-H'内容类型:application/X-www-form-urlencoded'\参数进入请求主体,而不是参数。谢谢@Logan Wlv。不幸的是,我需要维护相同的调用约定,因为我正在重构一个现有端点。您能解释一下为什么他的示例使用@PostMapping吗?您只需要阅读-G选项的文档:使用此选项时,所有数据都将使用-d、-data、,--data binary或--data urlencode将在HTTP GET请求中使用,而不是在POST请求中使用。数据将附加到带有“?”分隔符的URL。感谢您的回复。不幸的是,我正在重构遗留端点,因此无法更改调用。在我看来,这似乎是一个春季启动错误,在我的拙见。