HTTP PUT请求该如何传输请求参数呢?

PUT请求该如何传输请求参数呢?

有如下的接口

@RequestMapping(value = "testPut", method = RequestMethod.PUT)
public Result<Void> testPut(@RequestParam String foo, @RequestParam String bar) {
    System.out.println(foo + " " + bar) ;
    return Result.success(null);
}

通过CURL来调用该接口

# 通过-d传输请求参数失败
curl -X PUT  -d "foo=foo&bar=bar" 'http://localhost:8080/testPut'
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'foo' is not present

# 但直接放在url后面是可以的
curl -X PUT  'http://localhost:8080/testPut?foo=foo&bar=bar'

但我想像POST一样 以请求体的方式传输请求参数, 而不是作为URL的一部分

现在我的方法是

@RequestMapping(value = "testPut2", method = RequestMethod.PUT)
public Result<Void> testPut2(@RequestBody FooBar fooBar) {
    System.out.println(fooBar) ;
    return Result.success(null);
}
@Data
static class FooBar{
    public String foo;
    public String bar;
}

然后以json的方式调用

curl -X PUT  -H "Content-Type: application/json" -d '{"foo":"foo","bar":"bar"}' 'http://localhost:8080/testPut2'

这样是可以的 但奇怪为什么PUT只能接收json呢?

阅读 80.3k
3 个回答

对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理,所以Spring拿不到。
解决方案:1、修改tomcat的server.xml:

<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000"
           redirectPort="8443"
           parseBodyMethods="POST,PUT,DELETE"
           URIEncoding="UTF-8" />

解决方案2、在web.xml中添加HttpPutFormContentFilter

    <!--Servlet不支持PUT表单,需要Spring支持-->
    <filter>
        <filter-name>httpPutFormContentFilter</filter-name>
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>httpPutFormContentFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

我是可以的,Spring 4.3。你是啥版本?

另外加下Content-type试试

curl -H 'Content-type: application/x-www-form-urlencoded' -X PUT -d 'foo=foo&bar=bar' localhost:8080/testPut
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏