SpringBoot - 获取 POST 请求参数详解

上一篇文章介绍了 Controller 如何接收通过 GET 方式传递过来的参数,这篇文章介绍一下何接收通过 POST 方式传递过来的参数。

本篇文章为了方便 使用 Postman 进行 POST 请求 的测试

一、接收 Form 表单数据

1、基本的接收方法

(1)创建 Controller 接收 form-data 格式的 POST 数据,如下所示:

@RestController
public class BookController {

    @PostMapping("/add")
    public String save(@RequestParam("name") String name,
                       @RequestParam("author") String author){

        System.out.println("书名:" + name + ", 作者: " + author);

        return "书名:" + name + ", 作者: " + author;
    }

}

(2)、测试结果:

说明:

  • 使用 required = false 标注参数是非必须的。
  • 使用 defaultValue 给参数指定个默认值。

2、使用 map 来接收参数

(1)用 map 接收 Controller 直接接收所有的请求参数:

@RestController
public class BookController {

    @PostMapping("/add")
    public String save(@RequestParam Map<String, Object> map){

        System.out.println("书名:" + map.get("name") + ", 作者: " + map.get("author"));

        return "书名:" + map.get("name") + ", 作者: " + map.get("author");
    }

}

 (2)、重启服务测试

 

3、使用数组或List接收多个参数

(1)创建 Controller 如下所示:

@RestController
public class BookController {


    @PostMapping("/many")
    public String many(@RequestParam String[] names){

        return Arrays.toString(names);
    }
}

(2)、重启测试

 4、使用对象来接收参数

(1)、创建一个实体类 Book。

public class Book {

    private String name;

    private String author;

   // 省略 getter setter 方法

}

(2)、定义 Controller  

@RestController
public class BookController {


    @PostMapping("/add")
    public String save(Book book){

        System.out.println("书名:" + book.getName() + ", 作者: " + book.getAuthor());

        return "书名:" + book.getName() + ", 作者: " + book.getAuthor();
    }
}

(3)、运行测试

 

二、接收 JSON 数据

在前后端分离项目中,一般是通JSON格式进行数据的传输,通过JSON 发送POST数据的格式很简单,只需要把 form 接收数据时 Controller 中的方法参数钱加上一个 @Requestbody 注解接口。如下所示:

(1)、Controller 示例:


@RestController
public class BookController {


    @PostMapping("/add")
    public String save(@RequestBody Book book){

        System.out.println("书名:" + book.getName() + ", 作者: " + book.getAuthor());

        return "书名:" + book.getName() + ", 作者: " + book.getAuthor();
    }
}

(2)、运行测试:

Spring Boot中的Filter是一种拦截所有请求的方式,无论是GET请求还是POST请求都会被Filter拦截到。但是有时候会遇到Filter获取不到POST请求参数的情况,这时候需要检查一下请求头中的Content-Type是否是application/x-www-form-urlencoded。 如果Content-Type是application/x-www-form-urlencoded,则需要通过HttpServletRequest.getParameter()方法来获取请求参数。例如: ``` java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取请求参数 String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); ... // 继续处理请求 chain.doFilter(request, response); } } ``` 如果Content-Type是application/json,则需要通过读取请求体来获取请求参数。例如: ``` java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 获取请求体 BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } // 解析JSON参数 JSONObject json = JSONObject.parseObject(sb.toString()); String param1 = json.getString("param1"); String param2 = json.getString("param2"); ... // 继续处理请求 chain.doFilter(request, response); } } ``` 总之,要根据请求头中的Content-Type来确定获取POST请求参数的方法,否则会导致获取不到参数的情况。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值