前言:

作为后端,我们经常需要和前端进行数据之间的交互,而我们从前端获取的方式主要有下面几种

  • 路径中的数据,例如localhost:/user/2,这时我们需要获得路径上的数字2
  • 存放到url头里的参数例如localhost:/user?name=zhang
  • 存放到body里的数据,使用普通编码格式(下面详细解释)我们可以通过@requestParam获取
  • 存放到body里的json格式数据,使用application/json格式,我们可以使用@requestBody获取

在postman中我们可以找到这几种方法:

Springboot path spring boot pathvariable接收两个参数_数据


Springboot path spring boot pathvariable接收两个参数_sprngboot_02

Springboot path spring boot pathvariable接收两个参数_Springboot path_03


下面我们依次介绍:

@pathVariable

url路径上的参数我们可以使用@pathVariable这个注解获得,他也可以和后面的@requestbody和@requestParam一起使用

前台url: localhost:8090/pathTest/sci/2 注意中文和.可能会出现问题

后台代码:

@PostMapping("pathTest/{bookType}/{bookId}")  
    public String pathVariableTest(@PathVariable("bookType") String bookType,@PathVariable("bookId") Integer bookId){    
        return "test";
    }
//使用@pathVariable这个注解,  最上面url中的{}内可以随便填,但下面@pathVariable里的需要和下面一致

最终我们可以从后台获取这个数据:

Springboot path spring boot pathvariable接收两个参数_ajax_04

@RequestParam

@RequestParam这个注解是最灵活的注解,我们即使不用这个注解,也可以使用它,因为它是默认的,

前端它可以使用url,和body传递

后端它可以同时使用对象和字符串获得

前端

我们知道,http请求有get和post之分,get没有请求体,我们使用get传参为

localhost:8090/paramBodyTest?bookName=java编程思想&bookId=2

而当我们使用post时,一般会将参数写入请求体,即body内,使用的编码格式为 application/x-www-form-urlencoded

后端

后端我们首先可以使用同名的字符串或者其他类型接受单一字符,也可以使用对象javaBean接收(必须写好get,set方法,此例子里book对象包括bookName[String],bookId[int],author[String]三个属性)

当我们不前后端的名字相一致时,我们可以不使用注解,但当不一致时,例如前端属性名为bookName,后端属性名为name,我们使用@RequestParam(“bookName”)此注解即可

@PostMapping("paramBodyTest")
    public String ParamBodyTest(@RequestParam("bookName") String name,Book book){
        System.out.println(name+book.getBookId());
        return "test";
    }

Springboot path spring boot pathvariable接收两个参数_Springboot path_05

@RequestBody

@RequestBody专作用于请求体格式为application/json时使用,因此http请求为get时无法使用,只有为post时才能使用.而当我们选中application/json这种格式传输数据的时候,我们必须使用@requestBody这一注解,否则程序报错,同理使用了这一注解,前端也只能采用json格式

@RequestBody只能接收一个对象,(同时前端只能传一个),因此当有多个对象时我们也必须合成一个对象使用,@RequestBody也不允许使用字符串接收单个数据,即使前端只传{“name”:“zhang”}这种格式,后台接受也会乱码.

前端传输:使用application/json 传送 {“bookId”:12,“bookName”:“java编程思想”}这个json串

@PostMapping("jsonBodyUrlTest")
    public String jsonBodyUrlTest(String name,@RequestBody Book book){
        return "test";
    }

Springboot path spring boot pathvariable接收两个参数_数据_06

搭配
  • @pathVariable可以和其他两种任意搭配,
  • 当http请求为get时,数据放在url传输,只能使用@requestParam
  • 当http请求为post时,可以请求体使用@requestBody,在url使用@RequestParam,此种可以实现

下面我们使用三种方式搭配起来测试一下:

  • url: localhost:8090/requestTest/2?name=zhang
  • 请求方式: post application/json
  • 数据: {“bookId”:12,“bookName”:“java编程思想”}
  • 接收代码:
@PostMapping("requestTest/{name}")
    public String jsonBodyUrlTest1(@PathVariable("name")Integer id,@RequestBody Book book,@RequestParam String name){
        return "test";
    }
  • 结果:

Springboot path spring boot pathvariable接收两个参数_数据_07

map类型

初次之外我们还可以使用map类型接受数据

前端传送数据,分别为使用请求体application/x-www-form-urlencoded 和application/json格式的相同数据:

{“bookId”:12,“bookName”:“java编程思想”,“name”:“zhang”}

@PostMapping("paramMapTest")
    public String paramMapTest(@RequestParam Map map){ 
        return "test";
    }

    @PostMapping("bodyMapTest")
    public String paramMapTest1(@RequestBody Map map){
        return "test";
    }

最终我们都能得到相同的结果:

Springboot path spring boot pathvariable接收两个参数_Springboot path_08

扩充

  1. @requestBody只能使用一次,因为读取json的流只能使用一次,一个方法出现两个注解@RequestBody的结果是报错
  2. 实体类无需加@RequestParam, map必须加@RequestParam, 其他字符串等加上@RequestParam必须传值,你也可以加入@RequestParam(value=“mh”, required = false),这样就和不加注解是一样的
  3. url?userName=zh&userName=an即一个url含有多个同名的参数,传到后台是zh,an可以使用数组或者list获取
public String requestparam8(@RequestParam(value="userName") String []  userNames) 

public String requestparam8(@RequestParam(value="userName") List<String> list)