Java / Spring Boot开发RESTful 风格项目

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. 小结

使用 Spring Boot 开发 RESTful 风格的 Web 项目,是当前主流的 Web 项目开发模式。

这种开发模式的特点就是简单、明确。简单主要是依赖 Spring Boot 实现,明确就是靠 RESTful 风格来规范。

简单的目的就是提高开发效率;明确的目的是统一规范,从而降低沟通成本,最终也是为了提高开发效率。

Spring Boot 和 RESTful ,绝配!