前言:
作为后端,我们经常需要和前端进行数据之间的交互,而我们从前端获取的方式主要有下面几种
- 路径中的数据,例如localhost:/user/2,这时我们需要获得路径上的数字2
- 存放到url头里的参数例如localhost:/user?name=zhang
- 存放到body里的数据,使用普通编码格式(下面详细解释)我们可以通过@requestParam获取
- 存放到body里的json格式数据,使用application/json格式,我们可以使用@requestBody获取
在postman中我们可以找到这几种方法:
下面我们依次介绍:
@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里的需要和下面一致
最终我们可以从后台获取这个数据:
@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";
}
@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";
}
搭配
- @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";
}
- 结果:
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";
}
最终我们都能得到相同的结果:
扩充
- @requestBody只能使用一次,因为读取json的流只能使用一次,一个方法出现两个注解@RequestBody的结果是报错
- 实体类无需加@RequestParam, map必须加@RequestParam, 其他字符串等加上@RequestParam必须传值,你也可以加入@RequestParam(value=“mh”, required = false),这样就和不加注解是一样的
- 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)