RESTful风格是一种基于HTTP协议的软件架构设计风格,由Roy Fielding在2000年提出,旨在通过资源抽象、统一接口和无状态约束构建简洁、可扩展的Web服务。 其核心是使用URI定位资源、HTTP方法(如GET、POST、PUT、DELETE)描述操作,并以JSON/XML格式传输数据,适用于分布式系统开发。
一、定义与核心原则
REST(Representational State Transfer)是一种设计原则而非标准,强调客户端-服务器交互的简洁性和可维护性。核心原则包括:
无状态性:每个请求包含处理所需的所有信息,服务器不保存客户端状态,便于水平扩展和缓存。
统一接口:通过标准HTTP方法操作资源,确保接口一致性。
资源为中心:所有内容抽象为资源(如数据对象),用URI唯一标识。
可缓存:服务器通过响应头指示缓存策略,提升性能。
二、URI与HTTP方法设计
URI规范:
使用名词复数表示资源(如/employees),避免动词。
层级关系用正斜杠分隔(如/employees/101/departments),结尾无斜杠。
版本号嵌入URI(如/v1/employees)。
HTTP方法映射:
GET:查询资源(幂等、安全)。
POST:创建资源(非幂等)。
PUT:更新完整资源(幂等)。
DELETE:删除资源(幂等)。
PATCH:更新部分资源(非幂等)。
三、RESTful的核心原则(约束)
要被称为RESTful,一个系统必须满足以下六个约束:
1.客户端-服务器
关注点分离。客户端负责用户界面和用户体验,服务器负责数据处理和存储。两者可以独立演化。
2.无状态
非常重要。每个来自客户端的请求必须包含服务器处理该请求所需的所有信息。服务器不应存储任何客户端的上下文信息。会话状态完全由客户端负责维护(例如通过Token)。
好处:提高了可见性、可靠性、可伸缩性。
3.可缓存
服务器返回的响应必须明确表明是否可以被缓存。如果可以,客户端或中间缓存系统可以重用之前的响应,以提高效率、减少服务器压力。
4.统一接口
这是REST系统设计的核心。它包含几个子原则:
①资源的标识:每个资源都有一个唯一的URI(统一资源标识符)。例如:/users/123。
②通过表述对资源执行操作:客户端通过操作资源的表述(如JSON、XML)来操作资源本身,而不是直接操作资源。
③自描述的消息:每个消息(请求或响应)都包含足够的信息来描述如何处理自己。
④HATEOAS:超媒体作为应用状态的引擎。这是REST的最高形态,意味着客户端通过与服务器返回的超媒体内容(包含链接)互动,来发现和执行可用的操作。例如,获取一个订单后,响应里会包含指向“付款”、“取消订单”等操作的链接。
5.分层系统
系统可以由多层组成,客户端无需知道它是直接与终端服务器通信,还是与中间的代理、负载均衡器等通信。这有助于提高系统的可扩展性和安全性。
6.按需代码
这是一个可选的约束。服务器可以临时向客户端传输一些可执行的代码(如JavaScript),以扩展客户端的功能。
四、如何设计一个RESTful API?
对于大多数开发者来说,设计RESTful API主要关注如何实现统一接口。
-
使用URI(统一资源标识符)来标识资源
①资源使用名词,而不是动词。
不推荐:/getUser,/deleteOrder
推荐:/users,/orders
②使用复数名词 来表示资源集合。
/users(用户集合),/products(产品集合)
③使用HTTP方法来表示操作。
④资源之间的层级关系:
获取某个用户的所有订单:GET/users/123/orders
获取某个用户某个订单的详情:GET/users/123/orders/456 -
使用标准的 HTTP 状态码表示结果
服务器应该返回恰当的HTTP状态码,让客户端能快速理解请求结果。
200 OK - 请求成功。
201 Created - 资源创建成功。通常配合Location头部返回新资源的URI。
204 No Content - 请求成功,但无返回内容(如DELETE成功)。
400 Bad Request - 客户端请求有错误(如参数校验失败)。
401 Unauthorized - 未认证。
403 Forbidden - 无权限。
404 Not Found - 资源不存在。
500 Internal Server Error - 服务器内部错误。 -
数据格式
①请求/响应体:通常使用JSON作为数据交换格式,因为它轻量、易读。
②在 HTTP 头部中指定:
请求:Content-Type: application/JSON
响应:Content-Type: application/JSON
五、优点与缺点
1.优点:
①清晰简洁:URI直观,易于理解和维护。
②可扩展性好:无状态和分层约束使其易于水平扩展。
③松耦合:客户端和服务器独立演化,只要接口不变。
④利用现有标准:直接基于HTTP协议,无需引入新协议。
2.缺点:
①无状态约束可能带来挑战:需要客户端在每次请求中都携带认证信息(如 Token),可能会增加网络开销。
②不适合所有场景:对于实时通信(如聊天、在线游戏),REST 可能不是最佳选择,WebSocket 或 gRPC 更合适。
③“过度设计”风险:对于非常简单的内部服务,严格遵守所有 REST 约束可能显得繁琐。
六、总结
RESTful 是一种强大且流行的 Web API 设计哲学。它通过资源、URI、HTTP方法和状态码这些简单的概念,构建出统一、健壮和可扩展的Web服务。理解和遵循RESTful风格是现代后端和全栈开发者的必备技能。