SpringMVC系列(五)(响应实验以及Restful架构风格(上))
0 引言
作者正在学习SpringMVC相关内容,学到了一些知识,希望分享给需要短时间想要了解SpringMVC的读者朋友们,想用通俗的语言讲述其中的知识,希望与诸位共勉,共同进步!
本系列会持续更新!!可以放心食用!
ps:RestFul架构风格会分为上中下三篇来描述,名字分别为系列五-系列七,这三篇会同一时间发布!!!
1 响应处理实验
在本系列四和五中,我们通过十个请求处理实验,基本上把前端传递过来的请求的处理给过了一遍,接下来的响应实验则是从我们的后端需要怎么返回数据给前端的问题。
1.1 响应实验:返回一个JSON格式数据
假设我需要给前端返回一个People对象,并以JSON格式的数据传输,我们可以进行以下测试:
首先在网页打开local:8080,并点击:
点击F12我们发现点击这个前端给我的发送的请求是/resp01,并且经过测试请求类型为Get:
所以后端的测试代码可以写成:
@RequestMapping("/resp01")public People resp01(){People people = new People();people.setUsername("张三");people.setPassword("123456");people.setCellphone("123456789");people.setAgreement(true);people.setSex("男");people.setGrade("2021级");people.setHobby(new String[]{"看电影","看小说"});return people;}
注意,我们在后端只需要返回对象,SpringMVC会自动把返回的对象转化为JSON格式!
网页中测试结果:
成功返回!
1.2 响应实验:返回一个下载文件
这种情况其实我们经常碰见,当我们去官网上下载什么东西的时候,是不是需要点击一个下载按钮,然后在我们的下载出就会弹出当前在下载的.exe文件,例如我们在下载百度网盘的客户端的时候:
我们这次实验要做的就是当前端发送请求过来时,我们返回给前端一个照片文件,后端的代码可以这样写:
@RequestMapping("/download")public ResponseEntity<byte[]> download() throws Exception {FileInputStream fileInputStream = new FileInputStream("D:\\1.png");byte[] bytes = fileInputStream.readAllBytes();return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(bytes.length)//内容处理方式.header("Content-Disposition", "attachment;filename=1.png").body(bytes);}
最核心的代码是:
return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(bytes.length)//内容处理方式.header("Content-Disposition", "attachment;filename=1.png").body(bytes);
这一块内容,经过前面系列我们知道了HttpEntity,里面封装了包括请求头以及请求体中的所有数据,ResponseEntity则是封装了响应头和响应体中所有的数据。
1)contentType是指定响应体中内容的类型;
2)contentLength指的是内容的长度;
3)header里的设置是相对固定的,只有我们在响应头中插入这些内容,前端才会响应成下载文件
4)body传入实际内容。
写完之后我们进行测试:
点击测试,网页结果返回:
返回成功!!
PS:响应处理相关代码已更新放置网址:
lin/请求测试十个实验
不想敲代码的朋友们可直接查看
2 Restful软件架构风格
2.1简介
用简单的话来说RESTful 代码架构是一种设计风格,就像盖房子有统一规划一样。客户端就像来你家玩的朋友,服务器就像是你的家,双方通过网络这条 “路” 来沟通。采用 HTTP 协议约定的规则,用网址(URL)确定要操作的东西(资源),通过不同的方法(GET、POST、PUT、DELETE 等,类似于不同的动作指令),客户端像朋友一样跟服务器交流,来获取、创建、修改、删除服务器上的信息,整个过程服务器不记性(无状态),每次对话完就忘记之前的事儿,这样大家交流简单、高效、标准统一。
2.2 简要说明
我们可以看出Restful风格下的网址请求,如果请求对单个员工数据表进行操作的话前面路径都是/employee,也可以说当你对某一个数据库进行操作,你的前置路径就可以统一规划成/XX,之间业务的不同可以通过请求方式以及后置路径的不同来体现!!!这就是Restful风格代码!在多层级的业务代码中,主要在controller包中进行体现!!!
2.3 举例说明--使用员工增删改查的例子
2.3.1 初始准备
(1)首先我们先创建一个新工程,注意需要勾选下面这几个依赖:
(2)然后创建一个新的MySQL数据表,使用以下语句创建数据表:
CREATE SCHEMA `crud` ;/*Navicat Premium Dump SQLSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80027 (8.0.27)Source Host : localhost:3306Source Schema : restful_crudTarget Server Type : MySQLTarget Server Version : 80027 (8.0.27)File Encoding : 65001Date: 20/08/2024 18:46:17
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;USE crud; -- 添加此语句选择数据库-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工名字',`age` int NULL DEFAULT NULL COMMENT '年龄',`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱',`gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性别',`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '住址',`salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪资',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, '张三', 11, 'aa@qq.com', '男', '西安', 9999.00);
INSERT INTO `employee` VALUES (4, 'leifengyang', 10, 'aaa', '男', 'sss', 100.00);SET FOREIGN_KEY_CHECKS = 1;
我们可以创建完成后可以进MySQL Workbench里看看在员工表中已经存储了这两条数据(没有下载MySQL以及MySQL Workbench可以去找一找教程进行安装):
(3)然后回到我们代码端,在配置文件application.properties中先配置如下:
用户名和密码使用自己的就可以啦!!接下来就是正式的代码环节。
2.3.1 业务代码结构
主要包括:
主要结构存在bean/dao/service/controller这四个包
1)bean
专门用于存放对象类的地方,比如我们需要增删改查的员工就需要使用的员工类,代码如下:
import lombok.Data;import java.math.BigDecimal;@Data
public class Employee {private Long id;private String name;private Integer age;private String email;private String gender;private String address;private BigDecimal salary;
}
注意这与数据库中的员工表里的属性一一对应!!!!
2)dao
这个包下,主要对接数据库,主要编写对数据库增删改查的操作,需要分成接口以及实现两个部分
3)service
这个包主要是会对dao包传递过来已经处理后的的数据进行真正的业务代码编写,也是需要分成接口以及实现两个部分
4)controller
这个包下,主要对接前端的请求,对前端输入的请求数据进行处理。且需要分成接口以及实现两个部分。这一部分主要体现Restful风格!!具体在后续文章中给出详细解释!
对于dao、service以及controller下的包需要干什么可能还有点抽象,在本系列(六)中会进行详细的代码编写
参考:
P102-107
107.RESTful - API 接口设计的架构风格_哔哩哔哩_bilibili