SpringBoot接收数据的三种方式-2

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

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

下面我们依次介绍:

@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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值