概述

RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构。我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP 协议的Web 接口,需要注意的是它和 HTTP 协议并非绑定关系。我的个人理解就是:通过HTTP协议不同请求方法(GET、POST、PUT、Patch,DELETE)来判断如何操作统一命名的资源,并且通过不同的响应码来知道执行的状态。

关于 RESTful API 具体详细介绍,我推荐阅读下面 3 篇博客:
API设计:https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design By MicroSoft Azure
RESTful API设计:让您的用户满意的13个最佳实践:https://blog.florimond.dev/restful-api-design-13-best-practices-to-make-your-users-happy By Florimond Manca
RESTful API 最佳实践:http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html By 阮一峰

正如 RESTful API设计:让您的用户满意的13个最佳实践中所说:I have no authority to say that the following practices comply 100% with the holy REST principles (if there is such a thing!).
我没有权力说下面的做法100%符合神圣的REST原则(如果有这样的话!)。
我也不敢保证我的这篇文章绝对符合 REST ,但是我会尽最大努力向 REST 靠拢。

文中为了快速展示前台 RESTful 使用操作,所以示例并没有对接数据库,示例代码只是写死的逻辑返回。后期文章会将这个洞补上。

本文代码示例是在 SpringBoot 上进行操作的,如果你不会搭建SprignBoot项目可以查看我关于 SpringBoot 2 快速搭建 3 篇总结:
玩转SpringBoot 2 快速搭建 | Spring Initializr 篇
玩转 SpringBoot 2 快速搭建 | SpringToolSuite 篇
玩转 SpringBoot 2 快速搭建 | IntellJ IDEA篇

示例程序环境版本:
SpringBoot Version:2.1.0.RELEASE
SpringMVC Version:5.1.2RELEASE
Maven Version:3.2.5
JDK Version:1.8.0_144

实战

用户 Model 的代码:

下面是用户的 Model 类,用户类里面包含用户名称和用户年龄 2 个成员变量。

package cn.lijunkui.springbootlearn.restful.model;public class User {private String name;private Integer age;//省略get and set 方法
}

用户接口 Controller 类:

@RestController()
@RequestMapping("/user")
public class UserController {Logger log = LoggerFactory.getLogger(UserController.class);/*** 根据用户id 查询用户* @return*/@GetMapping("/{id}")public ResponseEntity<User> get(@PathVariable(name = "id") Long id){User user = new User("lijunkui",18);log.info("查询用户成功:"+"id:{}",id);return ResponseEntity.ok(user);}/*** 查询所有的用户* @return*/@GetMapping("/")public ResponseEntity<List<User>> getAll(){List<User> userList = new ArrayList<User>(){{add(new User("lijunkui1",18));add(new User("lijunkui2",18));add(new User("lijunkui3",18));}};return  ResponseEntity.ok(userList);}/*** 添加用户*/@PostMapping("/")public ResponseEntity<User> add(@RequestBody User user){log.info("添加用户成功:"+"name:{},age:{}",user.getName(),user.getAge());return  ResponseEntity.status(HttpStatus.CREATED).body(user);}/*** 更新用户* @param user* @return*/@PutMapping("/")public  ResponseEntity<Void> updatePut(@RequestBody User user){log.info("修改用户成功:"+"name:{},age:{}",user.getName(),user.getAge());return ResponseEntity.ok().build();}/*** 局部更新* @return */@PatchMapping("/{name}")public ResponseEntity<Void> updatePatch(@PathVariable("name") String name){log.info("修改用户成功:"+"name:{}",name);return ResponseEntity.ok().build();}/*** 删除用户*/@DeleteMapping("/{id}")public ResponseEntity<Void> delete(@PathVariable("id") Long id){log.info("删除用户成功:"+"id:{}",id);return  ResponseEntity.status(HttpStatus.NO_CONTENT).build();}
}

@RestController():声明在 Controller 上,表明该 Controller 为 RestFul 风格的Controller。

该注解在 Spirng 4.0 中也同样适用,但是在SpringMVC 3.0 中我们需要通过@Controller 和
@ResponseBody 来达到 @RestController()的效果。

@GetMapping():声明使用 Get 方式访问的接口,该方式主要用于数据查询。

@PostMapping():声明使用 Post方式访问的接口,该方式主要用于数据新增。

@PutMapping():声明使用 Put方式访问的接口,该方式主要用于全部更新。

@PatchMapping():声明使用 Patch方式访问的接口,该方式主要用于局部更新。

@DeleteMapping():声明使用 Delete 方式访问的接口,该方式主要用于数据删除。

对于@GetMapping() 和 @PostMapping() == @RequestMapping(value = “”,method
= RequestMethod.GET) @RequestMapping(value = “”,method = RequestMethod.POST) 。

ResponseEntity :用于封装响应回客户端数据和响应状态码的。常用用法如下:

ResponseEntity.ok().build():表示无返回数据,并且响应状态码是 200
ResponseEntity.ok(user):表示有回数据,并且响应状态码是 200
ResponseEntity.status(HttpStatus.NO_CONTENT).build():表示无返回数据,并且响应状态码是 204
ResponseEntity.status(HttpStatus.CREATED).body(user):表示有返回数据,并且响应状态码是 201

@PutMaping() BUG

Put 方式接受不到参数问可以通过配置 HttpPutFormContentFilter 来解决。具体处理代码如下:

/*** 解决restFul put 参数无法接收的问题*/
@Component
public class PutFilter extends HttpPutFormContentFilter {}

参考文献:HTTPS://www.aliyun.com/jiaocheng/852091.html

测试

RESTful 接口测试是通过 PostMan 来进行演示的,你也可以选择你顺手的工具进行测试哈。

根据用户id 查询用户:选择 GET 调用方式,然后在地址栏输入: localhost:8080/sbe/user/1 最后点击 Send。如下图所示成功返回用户信息和200 响应码。

查询所有的用户:选择 GET 调用方式,地址栏输入 localhost:8080/sbe/user/。

添加用户:选择 POST 调用方式,地址栏输入 localhost:8080/sbe/user/ 。选择Body – JSON(application/json) 输入要添加用户json 信息。如下图所示:

修改用户: 选择 PUT 调用方式,地址栏输入 localhost:8080/sbe/user/ 。选择Body – JSON(application/json) 输入要修改用户json 信息。如下图所示:

修改用户:选择 Patch 调用方式,地址栏输 localhost:8080/sbe/user/你想要修改的名称。如下图所示:

删除用户:选择 DELETE 调用方式,地址栏输入: localhost:8080/sbe/user/1。如下图所示:

小结

SpringBoot 开发 RESTful Api 还是比较简单的,将 Controller 通过 @RestController 声明后 在通过具体的动作Mapping注解 + ResponseEntity 定义返回数据和响应的状态码 基本就可以搞定。如果你没有操作过,建议跟着博客敲一遍哈。

代码示例

本文具体代码可以查看我的 GitHub 仓库 springbootexamples 中模块名为 spring-boot-2.x-restful-api 的 cn.lijunkui.restful.basic包下进行查看

Github:https://github.com/zhuoqianmingyue/springbootexamples 如果您对这些感兴趣,欢迎 点个赞或者关注给予支持!

玩转 SpringBoot 2 快速整合 | RESTful Api 篇相关推荐

  1. 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)

    概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...

  2. 玩转 SpringBoot 2 快速整合 | JSP 篇

    前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面.作为Java技术系列的一部分,JSP技术可以快速开发独立 ...

  3. 玩转 SpringBoot 2 快速整合 Filter 注解版

    前言 本文主要介绍如何在SpringBoot 2 中使用 Filter 的快速搭建教程,阅读前需要你必须了解 Filter 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一步: ...

  4. 玩转 SpringBoot 2 快速整合 Listener

    前言 本文主要介绍如何在SpringBoot 2 中使用 Listener 的快速搭建教程,阅读前需要你必须了解 Listener 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 ...

  5. 玩转 SpringBoot 2 快速整合 Servlet

    前言 本文主要介绍如何在SpringBoot 2 中使用 Servlet 的快速搭建教程,阅读前需要你必须了解 Servlet 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一 ...

  6. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器(HandlerInterceptor).使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInt ...

  7. 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇

    前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...

  8. 玩转 SpringBoot 2 快速整合 Filter

    概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 javaConfig(@Configuration +@Bea ...

  9. 玩转 SpringBoot 2 快速整合 | FreeMarker篇

    FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...

最新文章

  1. 2、cookie session token详解
  2. windows笔记-内核对象
  3. 迁移.net framework 工程到.net core
  4. JavaParser生成,分析和修改Java代码
  5. 数字音频特效的软件实现项目
  6. [ app.json 文件内容错误] app.json: [“usingComponents“][“van-button“]: “@vant/weapp/button/index“ 未找到
  7. 关联分析中可能的规则数的求法
  8. VisualStudio中解决方案
  9. 深度学习自学(三十四):换衣场景下行人重识别
  10. python上传大文件s3_aws s3上传大文件的4种方法
  11. 关于group by 两个或以上条件的分析
  12. 5G NR 随机接入 总结
  13. php完全匹配,PHP完全匹配验证
  14. 低配电脑不能运行大型游戏?试试AWS EC2
  15. 台式计算机中的CPU指的是,电脑硬件认识之什么是电脑的CPU(cpu详细介绍)
  16. js中事件绑定的几种方式
  17. 花仙里云课堂知识付费v1.2.25知识付费 教育 直播
  18. JSTL: empty 可以减少很多繁冗的判空
  19. JS-BOM对象概叙
  20. 工作效率提升技巧三:做事的心态

热门文章

  1. python纵向制表符命令_Python中raw_input()中子命令的制表符完成
  2. python找思路_python 爬取贝壳的一些思路和方法设计(用地址找到小区名字)
  3. SpringCloud微服务权限控制(一)概述
  4. ik做尾巴摆动 maya_【周六幸福时刻】故事分享:小蝌蚪尾巴怎么没了
  5. 【实战】使用Job来修改Transform
  6. Atata——C# Web测试自动化框架
  7. Ubuntu 15 周年!
  8. 不使用输入框如何实现下拉_使用INFINITE AJAX SCROLL实现下拉加载效果
  9. list 泛型_带你深挖Java泛型类型擦除以及类型擦除带来的问题
  10. shell 获取ora报错信息_带你了解企业是如何编写脚本的-第2篇:Shell脚本规范