springboot之接受数据的三种⽅式:@requestParam,@requestBo。。。前⾔:
作为后端,我们经常需要和前端进⾏数据之间的交互,⽽我们从前端获取的⽅式主要有下⾯⼏种
路径中的数据,例如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,我们使⽤
适合新手的spring boot@RequestParam(“bookName”)此注解即可
@PostMapping("paramBodyTest")
public String ParamBodyTest(@RequestParam("bookName") String name,Book book){
System.out.println(BookId());
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";
}
最终我们都能得到相同的结果:
扩充
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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。