RESTful 是非常流行的架构设计风格。首先介绍 REST 的特征、HTTP方法与CRUD动作映射;然后讲解如何基于Spring Boot 设计统一的 RESTful 风格的数据接口;最后讲解在 Spring Boot 下如何使用 RestTemplate 访问 RESTful 接口。
什么是 REST
REST 是软件架构的规范体系结构,它将资源的状态以适合客户端的形式从服务器端发送到客户端(或相反方向)。在 REST 中,通过 URL 进行资源定位,用 HTTP 动作(GET、POST、DELETE、PUT等)描述操作,完成功能。
遵循 RESTful 风格,可以使开发的接口通用,以便调用者理解接口的作用。基于 REST 构建的 API 就是 RESTful(REST风格)API 。
各大机构提供的 API 基本都是 RESTful 风格的。这样可以统一规范,减少沟通、学习和开发的成本。
REST 的特征
HTTP 连接最显著的特点是:客户端发送的每次请求都需要服务器回送响应;在请求结束后,主动释放连接。从建立连接到关闭连接的过程称为“一次连接”,前后的请求没有必然的联系,所以是无状态的。
认识 HTTP 方法与 CRUD 动作映射
RESTful 风格使用同一个 URL ,通过约定不同的 HTTP 方法来实施不同的业务。
普通的URL 和 RESTful 风格 URL:
RESTful 方法的 CRUD 它通过 HTTP 方法来区分增加、修改、删除和查询。
Request
GET /zoos
GET /zoos/1
GET /zoos/1/employees
POST /animals //新增动物
POST /zoos/1/employees //为id为1的动物园雇佣员工
PUT /animals/1
PUT /zoos/1
DELETE /zoos/1/employees/2
DELETE /zoos/1/employees/2;4;5
DELETE /zoos/1/animals //删除id为1的动物园内的所有动物
实现 RESTful 风格的数据增加、删除、修改和查询
在 Spring Boot 中,如果返回 JSON 数据,则只需要在控制器中用 @RestController
注解。使用注解 @RequestMapping
的 value 指定 URI、method 来指定 HTTP方法。
// 获取资源列表
@RequestMapping(value="/article",method=RequestMethod.GET)
public List list(){
...
}
// 根据ID获取资源
@RequestMapping(value="/article/{id}",method=RequestMethod.GET)
public Article findById(@PathVariable("id")Integer id){
...
}
// 增加资源
@RequestMapping(value="/article",method=RequestMethod.POST)
public String save(Article article){
...
}
// 修改资源
@RequestMapping(value="/article",method=RequestMethod.PUT)
public String update(Article article){
...
}
// 根据ID删除资源
@RequestMapping(value="/article/{id}",method=RequestMethod.DELETE)
public String deleteById(@PathVariable("id")Integer id){
...
}
版本控制
随着业务需求的变更、功能的迭代,API的更改是不可避免的。当一个API修改时,就会出现很多问题,比如,可能会在 API 中新增参数、修改返回的数据类型。这就要考虑根据原先版本API编写的客户端如何保留或顺利过渡。所以,需要进行版本控制。
REST 不提供版本控制指南,常用的方法有 3 种:
过滤信息
如果记录数量很多,则服务器不可能一次都将它们返回给用户。API应该提供参数,实现分页返回结果。常用的参数:
确定 HTTP 的方法
在 RESTful 中,HTTP 的方法有以下几种:
确定 HTTP 的返回状态
HTTP 的返回状态一般有以下几种:
错误处理
定义统一返回格式
为了保障前后端的数据交互的顺畅,建议规范数据的返回,并采用固定的数据格式封装。
例:
// 异常信息:
{
"code":10001,
"msg":"异常信息",
"data":null
}
// 成功信息:
{
"code":200,
"msg":"成功",
"data":{
"id":1,
"name":"xxx"
}
}
异步任务
提交任务:
POST /batch-publish-msg
[{"from":0,"to":1,"text":"abc"},{},{}...]
返回:
{"taskId":3,"createBy":"Anonymous","status":"running"}
GET /task/3
{"taskId":3,"createBy":"Anonymous","status":"success"}
提交任务:
POST /batch-publish-msg
[{"from":0,"to":1,"text":"abc"},{},{}...]
返回:
{"taskId":3,"createBy":"Anonymous"}
GET /task/3/status
{"progress":"50%","total":18,"success":8,"fail":1}
认识 RestTemplate
在 Java 应用程序中访问 RESTful 服务,可以使用 Apache 的 HttpClient 来实现。不过此方法使用起来太烦琐。
Spring 提供了一种更简单便捷的模板类-- RestTemplate 来进行操作。
RestTemplate 是 Spring 提供的用于访问 REST 服务的客户端,它提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
RestTemplate 用于同步 Client 端的核心类,简化与 HTTP 服务的通信。在默认情况下,RestTemplate 默认依赖 JDK 的 HTTP 连接工具。也可以通过 setRequestFactory 属性切换到不同的 HTTP 源,比如 Apache HttpComponents、Netty和 OkHttp 。
RestTemplate 简化了提交表单数据的难度,并附带自动转换为 JSON 格式数据的功能。
RestTemplate 方法:
RestTemplate 默认使用 HttpMessageConverter 将 HTTP 消息转换成 POJO ,或从 POJO 转换成 HTTP 消息,默认情况下会注册主 MIME 类型的转换器,但也可以通过 setMessageConverters 注册其他类型的转换器。
REST(Representational State Transfer)表述性状态转换,REST指的是一组架构约束条件和原则。
如果一个架构符合REST的约束条件和原则,我们就称它为RESTful 架构。
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力,更好地使用现有Web标准中的一些准则和约束。
REST 是软件架构的规范体系结构,它将资源的状态以适合客户端的形式从服务器端发送到客户端(或相反方向)。在 REST 中,通过 URL 进行资源定位,用 HTTP 动作(GET、POST、DELETE、PUT等)描述操作,完成功能。
遵循 RESTful 风格,可以使开发的接口通用,以便调用者理解接口的作用。这样可以统一规范,减少沟通、学习和开发的成本。
REST 的特征
RESTful 风格使用同一个 URL ,通过约定不同的 HTTP 方法来实施不同的业务。
在 RESTful 中,HTTP 的方法有以下几种:
设计统一的 RESTful 风格的数据接口
版本控制
过滤信息
确定 HTTP 的方法
确定 HTTP 的返回状态
错误处理
定义统一返回格式
异步任务
认识 RestTemplate
RestTemplate 是 Spring 提供的用于访问 REST 服务的客户端,它提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
《Spring Boot 实战派》 龙中华