Spring Boot开发RESTful风格项目
前端工程师懂 HTML / CSS / JavaScript 和 Bootstrap 等前端技术与框架,但是几乎不懂后端 Java 语言。
后端工程师懂 Spring Boot 开发,略懂 HTML / CSS / JavaScript ,但是没用过前端框架。
这种情况,如果使用 FreeMarker / Thymeleaf / JSP 等模板引擎,将面临不小的困难。前端工程师得先去学习模板引擎的规则,后端人员需要跟前端沟通控制器交给模板引擎处理的数据。
1. RESTful介绍
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
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 进行可视化测试,此处结果如下:
原文链接: https://www.yukx.com/spring/article/details/2133.html 优科学习网Spring Boot开发RESTful风格项目
-
在HTML中,如果你想让一个输入框(input元素)不可编辑,你可以通过设置其readonly属性来实现。示例如下:input type="text" value="此处内容不可编辑" readonly在上述代码中,readonly属性使得用户无法修改输入框中的内容。另外,如果你希望输入框完全不可交
-
ASP.NET教程ASP.NET又称为ASP+,基于.NETFramework的Web开发平台,是微软公司推出的新一代脚本语言。ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不一样的开发模式:WebPages(Web页面)、
-
C# 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的通常形式:判断语句C#提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述if语句一个 if语句 由一个布尔表达式后跟
-
C#循环有的时候,可能需要多次执行同一块代码。通常情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的通常形式:循环类型C#提供了以下几种循环类型
-
C#数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,一般认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]
-
ASP.NET是一个由微软公司开发的用于构建Web应用程序的框架,它是.NETFramework的一部分。它提供了一种模型-视图-控制器(MVC)架构、Web表单以及最新的ASP.NETCore中的RazorPages等多种开发模式,可以用来创建动态网页和Web服务。以下是一些基础的ASP.NET编