Spring Boot 开发 RESTful 风格 Web 项目
1. 前言
很多研发团队,可能都会有一个体会,当多人研发一个项目时,并不能达到 1+1>2 的效果。有时候还会出现 1+1<1 ,即 2 个人还不如 1 个人干得快,甚是悲哀。
就比如我们要开发一个 Web 项目,由前端工程师和后端工程师共同完成。
前端工程师懂 HTML / CSS / JavaScript 和 Bootstrap 等前端技术与框架,但是几乎不懂后端 Java 语言。
后端工程师懂 Spring Boot 开发,略懂 HTML / CSS / JavaScript ,但是没用过前端框架。
这种情况,如果使用 FreeMarker / Thymeleaf / JSP 等模板引擎,将面临不小的困难。前端工程师得先去学习模板引擎的规则,后端人员需要跟前端沟通控制器交给模板引擎处理的数据。
怎么办呢,不要担心,大佬们早就解决这个问题了。
2. 前后端分离
前后端分离这种概念和技术,早就流行多年了。
具体点说,前端编写 HTML 页面,然后通过 Ajax 请求后端接口;后端把接口封装成 API ,返回 JSON 格式的数据;前端接收到 JSON 返回数据后渲染到页面。
前端工程师根本不需要懂后端,调用后端接口就行。后端使用 Spring Boot 控制器返回 JSON 十分简单,给方法添加个注解,就能将返回值序列化为 JSON 。
前端干前端的活,后端干后端的活,职责分明,界限明确。这就是前后端分离的好处啊!
3. RESTful 风格后端接口
前后端分离时,后端接口可不能太随意,目前后端接口编写大多遵循 RESTful 风格。
做后端接口的公司这么多,如果大家都定义自己的规范,是不利于公司之间的合作的。如果大家都能遵循一个规范来开发接口,很明显相关人员都能省心不少。
RESTful 就是一种非常流行的 HTTP 接口规范,简单明了,使用的人也多,用它准没错。
4. 整体流程说明
本节实现一个基于 RESTful 风格的 Spring Boot 商品浏览 API 实例。
做事之前,先定整体流程。凡事预则立,不预则废,老祖宗的智慧太厉害了,我们争取发扬光大。确定流程如下:
5. 开发阶段
5.1 根据需求制定 RESTful 风格的接口文档
既然是要做商品浏览页面,将商品增删改查都实现了就是了。 RESTful 风格接口并不麻烦,一般情况下需要项目团队一起商量制定。此处我们指定如下:
动词 | 接口含义 | 接口地址 |
---|---|---|
GET | 查询商品 (id=1) 信息 | http://127.0.0.1:8080/goods/1 |
GET | 查询商品列表信息 | http://127.0.0.1:8080/goods |
POST | 新增商品 | http://127.0.0.1:8080/goods |
PUT | 修改商品 (id=1) 信息 | http://127.0.0.1:8080/goods/1 |
DELETE | 删除商品 (id=1) | http://127.0.0.1:8080/goods/1 |
Tips: RESTful 风格通过 HTTP 动词( GET / POST / PUT / DELETE )区分操作类型, URL 格式比较固定,仅此而已,非常简单。
5.2 按文档开发后端 API 接口
相比于使用模板引擎,用 Spring Boot 开发后端接口简直太轻松了。通过给控制器添加注解,就能将控制器方法返回值序列化为 JSON 。程序员最爱,就是轻松又愉快。
5.2.1 使用 Spring Initializr 创建项目
Spring Boot 版本选择 2.2.5 , Group 为 com.imooc
, Artifact 为 spring-boot-restful
,生成项目后导入 Eclipse 开发环境。
像这种老套的重复操作,我还是拿出来讲讲,为何,因为要继续呵护我们的初学者们。万一有朋友因为一个小地方看不明白,丧失了学习编程的动力,那就是罪过了。
5.2.2 引入项目依赖
RESTful 项目其实就是标准的 Web 项目,引入 Web 项目依赖即可。
实例:
<!-- 引入web项目相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
5.2.3 创建商品类与商品服务类
创建商品类与商品服务类,以完成对商品的增删改查操作。由于本章我们的重点是演示 RESTful 后端接口,所以此处没有操作真实的数据库。
实例:
/**
* 商品类
*/
public class GoodsDo {
/**
* 商品id
*/
private Long id;
/**
* 商品名称
*/
private String name;
/**
* 商品价格
*/
private String price;
/**
* 商品图片
*/
private String pic;
//省略get set方法
}
实例:
/**
* 商品服务
*/
@Service // 注册为服务类
public class GoodsService {
/**
* 获取商品列表
*/
public List<GoodsDo> getGoodsList() {
List<GoodsDo> goodsList = new ArrayList<GoodsDo>();
GoodsDo goods = new GoodsDo();
goods.setId(1L);
goods.setName("苹果");
goods.setPic("apple.jpg");
goods.setPrice("3.5");
goodsList.add(goods);
return goodsList;
}
/**
* 按id获取商品信息,模拟返回对应商品信息
*/
public GoodsDo getGoodsById(Long id) {
GoodsDo goods = new GoodsDo();
goods.setId(1L);
goods.setName("苹果");
goods.setPic("apple.jpg");
goods.setPrice("3.5");
return goods;
}
/**
* 新增商品,模拟返回数据库影响行数
*/
public int addGoods(GoodsDo goods) {
return 1;
}
/**
* 根据商品id更新商品信息,模拟返回数据库影响行数
*/
public int editGoods(GoodsDo goods) {
return 1;
}
/**
* 根据商品id删除对应商品,模拟返回数据库影响行数
*/
public int removeGoods(Long id) {
return 1;
}
}
Tips: 服务层方法,建议不要使用 select /insert/update /delete 命名,因为服务层处理的逻辑往往不止于关系数据库表的增删改查。此处采用的是 get /add/edit /remove 。
5.2.4 根据 API 文档实现控制器方法
此处需要解释的地方我都写在注释中了。
实例:
@RestController // 通过该注解,第一是将GoodsController注册为控制器,可以响应Http请求;第二是可以将控制器中的方法返回值序列化为json格式。
public class GoodsController {
@Autowired // 自动装配goodsService
private GoodsService goodsService;
/**
* 查询商品信息
* 1、@GetMapping表示可以使用get方法请求该api
* 2、"/goods/{id}"表示请求路径为/goods/{id}的形式,其中{id}为占位符
* 3、@PathVariable("id")表示将占位符{id}的值传递给id
* 4、也就是说/goods/123请求的话,会将123传递给参数id
*/
@GetMapping("/goods/{id}")
public GoodsDo getOne(@PathVariable("id") long id) {
return goodsService.getGoodsById(id);
}
/**
* 查询商品列表,使用get方法
*/
@GetMapping("/goods")
public List<GoodsDo> getList() {
return goodsService.getGoodsList();
}
/**
* 新增商品
* 1、@PostMapping表示使用post方法
* 2、@RequestBody表示将请求中的json信息转换为GoodsDo类型的对象信息,该转换也是由SpringMVC自动完成的
*/
@PostMapping("/goods")
public void add(@RequestBody GoodsDo goods) {
goodsService.addGoods(goods);
}
/**
* 修改商品
*/
@PutMapping("/goods/{id}")
public void update(@PathVariable("id") long id, @RequestBody GoodsDo goods) {
// 修改指定id的商品信息
goods.setId(id);
goodsService.editGoods(goods);
}
/**
* 删除商品
*/
@DeleteMapping("/goods/{id}")
public void delete(@PathVariable("id") long id) {
goodsService.removeGoods(id);
}
}
5.3 使用 Postman 测试 API 接口可用
后端开发完 API 接口后,需要先进行下简单测试以保证接口是正确可用的。
我们可以使用 Postman 进行简单测试。启动 Spring Boot 项目后,使用 Postman 进行可视化测试,此处结果如下:
6. 视频演示
7. 小结
使用 Spring Boot 开发 RESTful 风格的 Web 项目,是当前主流的 Web 项目开发模式。
这种开发模式的特点就是简单、明确。简单主要是依赖 Spring Boot 实现,明确就是靠 RESTful 风格来规范。
简单的目的就是提高开发效率;明确的目的是统一规范,从而降低沟通成本,最终也是为了提高开发效率。
Spring Boot 和 RESTful ,绝配!