【问题标题】:Spring REST controller post requestSpring REST 控制器发布请求
【发布时间】:2015-06-08 00:29:00
【问题描述】:

我在春天有这个控制器

@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 中传递参数,只有当我使用 @RequestBody 将对象 JSON 作为参数时,我才使用 post,有什么办法吗使用 POST 发送字符串参数?

【问题讨论】:

    标签: java spring-mvc servlets


    【解决方案1】:

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

    中指定的

    以下是post form之前必须满足的条件 数据将填充到参数集:

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

    如果不满足条件且不包含post表单数据 在参数集中,发布数据必须仍然可供 servlet 通过请求对象的输入流。如果条件是 满足,post 表单数据将不再可供直接阅读 来自请求对象的输入流。

    由于您不发送任何 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
    

    请注意,您仍然可以在 URL 中传递查询参数

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多