Spring REST控制器发布请求

时间:2015-04-02 22:08:48

标签: java spring-mvc servlets

我在春天有这个控制器

@RestController
public class GreetingController {

    @RequestMapping(value = "/greeting",  method = RequestMethod.POST)
    public String greeting(@RequestParam("uouo") String uouo) {
        return uouo;
    }
}

当我测试它时

 curl -k -i -X POST -H "Content-Type:application/json"  -d uouo=test http://192.168.1.104:8080/api/greeting

测试结果

HTTP状态400 - 必需的字符串参数' uouo'不存在

我尝试了可能的事情,但我认为@RequestParam不能用于POST它总是使用GET传递URL中的参数,只有在我使用{{1}将对象JSON作为参数时才使用post有没有办法使用POST发送字符串参数?

1 个答案:

答案 0 :(得分:7)

如果内容类型为application/x-www-form-urlencoded,Servlet容器将仅为POST请求提供身体参数。如果内容类型是其他内容,它将忽略正文。这在Servlet Specification Chapter 3.1.1 When Parameters Are Available

中指定
  

以下是发布表格之前必须满足的条件   数据将填充到参数集:

     
      
  1. 请求是HTTP或HTTPS请求。
  2.   
  3. HTTP方法是POST。
  4.   
  5. 内容类型为application/x-www-form-urlencoded
  6.   
  7. servlet已对请求对象上的任何getParameter系列方法进行了初始调用。
  8.         

    如果不符合条件且未包含表格数据   在参数集中,后期数据必须仍然可用   servlet通过请求对象的输入流。如果条件是   遇到后,表格数据将不再可供直接阅读   来自请求对象的输入流。

由于您没有发送任何JSON,只需设置适当的内容类型

即可
curl -k -i -X POST -H "Content-Type:application/x-www-form-urlencoded" -d uouo=test http://192.168.1.104:8080/api/greeting

或让curl推断

curl -k -i -X POST -d uouo=test http://192.168.1.104:8080/api/greeting?uouo=test

请注意,您仍然可以在网址

中传递查询参数
curl -k -i -X POST -H "Content-Type:application/json"  http://192.168.1.104:8080/api/greeting?uouo=test