1. SpringBootWeb请求响应
1.1 Postman
-
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
Postman原是Chrome浏览器的插件,可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求
使用Postman还可以在发起请求时,携带一些请求参数、请求头等信息
-
作用:常用于进行接口测试
1.2 简单参数
- 简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
- 原始方式获取参数(略)
- SpringBoot方式
- 直接将请求参数名写进形参
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=张衰彪&age=666
//形参名和请求参数名保持一致
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){
System.out.println(name+" : "+age);
return "OK";
}
}
1.2.1 参数名不一致
- 参数名不一致时,因参数名不匹配,所以值为null
- 解决方案:使用Spring提供的@RequestParam注解完成映射
- 在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=张衰彪&age=666
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("name") String username , Integer age ){
System.out.println(username+" : "+age);
return "OK";
}
}
注意事项:@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错
1.3 实体参数
- 当传递参数很多时,一个一个写参数会很繁琐,我们可以将请求参数封装到一个实体对象中
要想完成数据封装,请求参数名必须与实体类的属性名相同,否则其属性值为null
1.3.1 简单实体对象
- 定义实体对象
public class User {
private String name;
private Integer age;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
@Override
public String toString() {return "User{" + "name='" + name + '\'' + ", age=" + age +'}';
}
}
- 定义Controller方法
@RestController
public class RequestController {
//实体参数:简单实体对象
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
}
1.3.2 复杂实体对象
- 套娃的实体类,(实体类中包含实体类属性)
- 定义实体类
- Address 实体类
public class Address {
private String province;
private String city;
getter/setter...
}
- User实体类
public class User {
private String name;
private Integer age;
private Address address;
getter/setter...
}
- 定义Controller方法
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=张衰彪&age=666&address.province="小韩"&address.city="尔首"
//实体参数:复杂实体对象
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "OK";
}
}
1.4 数组集合参数
- 用来收集表单中支持多选项的(复选框)同名的多个值
1.4.1 数组
- 数组参数:请求参数名与形参数组名称相同,定义数组类型形参即可接收参数
@RestController
public class RequestController {
//http://localhost:8080/arrayParam?hobby=game&hobby=java
//数组集合参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
}
1.4.2 集合
- 集合参数:请求参数名与形参集合对象名相同,y用@RequestParam 绑定参数关系
@RestController
public class RequestController {
//数组集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
}
1.5 日期参数
- 需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式后,方可传参
@RestController
public class RequestController {
//日期时间参数
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
}
1.6 JSON参数
- JSON在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式)
服务端Controller方法接收JSON格式数据:
- 传递json格式的参数,在Controller中会使用实体类进行封装。
- 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
- JSON数据如下
[
{
"name":"张衰彪",
"age":666,
"address":{
"province":"小韩",
"city":"尔首"
}
}
]
@RestController
public class RequestController {
//JSON参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
}
1.7 路径参数
- 在现在的开发中,经常还会直接在请求的URL中传递参数
http://localhost:8080/user/1
http://localhost:880/user/1/张衰彪
以上路径中,尾部数字既是路径也是参数
- 后端接受路径参数时,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数,当路径参数有多个时,使用多个{…}来标识该路径参数
@RestController
public class RequestController {
//路径参数
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
}
2. 响应
- 从后端将数据返回给前端
2.1 @ResponseBody
- 当我们需要将方法中处理好的数据通过return返回给前端时,将@ResponseBody注解书写在Controller方法上或类上即可
@RequestMapping注解是一个组合注解
@RestController = @Controller + @ResponseBody
在类上添加@RestController就相当于添加了@ResponseBody注解
方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器
2.2 统一响应结果
- 上述方法的返回值五花八门,如果我们开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护
- 在真实的项目开发中,无论是哪种方法,我们都会定义一个统一的返回结果
- 解决方法:将返回值定义为一个实体类,规定返回数据的格式
统一的返回结果使用类来描述,在这个结果中包含:
-
响应状态码:当前请求是成功,还是失败
-
状态码信息:给页面的提示信息
-
返回的数据:给前端响应的数据(字符串、对象、集合)
代码如下
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应码 描述字符串
private Object data; //返回的数据
public Result() { }
public Result(Integer code, String msg, Object data) { this.code = code;this.msg = msg; this.data = data; }
public Integer getCode() { return code; }
public void setCode(Integer code) { this.code = code; }
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public Object getData() { return data; }
public void setData(Object data) { this.data = data; }
//增删改 成功响应(不需要给前端返回数据)
public static Result success(){ return new Result(1,"success",null); }
//查询 成功响应(把查询结果做为返回数据响应给前端)
public static Result success(Object data){ return new Result(1,"success",data); }
//失败响应
public static Result error(String msg){ return new Result(0,msg,null); }
}
3. 分层解耦
3.1 三层架构
在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。
单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。
- 三层架构分别为
- Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层。处理具体的业务逻辑。
- Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。