REST(Representational State Transfer)即表现层状态转移,是一种软件架构风格,定义了一组架构约束条件和原则,常用于Web服务器和客户端之间的通讯。REST通讯采用无状态的请求响应式通讯方式,可以使服务端的负载和可扩展性得到很大的提高。
一、REST规范请求方法
REST请求代表特定的HTTP方法(GET、POST、PUT、DELETE),如发送一个GET请求代表获取一个资源,发送一个POST请求代表创建一个新的资源。HTTP协议中定义了一组简单的操作,即HTTP方法,用来指明用户希望对指定的资源执行什么样的操作,包括以下常用的四种:
- GET: 用于获取资源。如果请求成功,则返回表示资源的实体,否则返回错误码。GET请求不应该有副作用。
- POST: 用于创建资源。请求成功后会返回资源的实体。POST请求应该有副作用,如修改存储内容。
- PUT: 用于更新资源。如果请求成功,则返回更新后的资源。PUT请求也应该有副作用。
- DELETE: 用于删除资源。如果请求成功,则返回删除的实体。DELETE请求也应该有副作用。
下面是一个基于REST风格的API的示例:
GET /users // 获取所有用户 POST /users // 创建一个新用户 PUT /users/123 // 更新编号为123的用户 DELETE /users/123 // 删除编号为123的用户
二、REST接口规范
REST接口规范有以下几个方面:
1.资源标识符(URI)
每一个资源都有一个唯一的URI标识符,表示该资源。URI由主机名、端口号、资源路径构成。URI由三部分构成,即:scheme://host:port/path?query_string
。其中scheme代表请求协议(http、https等),host代表主机名、port代表端口号,path代表资源路径。
2.HTTP方法
REST风格的API使用HTTP协议中的方法来表示对资源的操作。常用的方法是GET、POST、PUT和DELETE方法。
3.消息负载格式
REST风格的API消息负载一般使用JSON格式,XML格式也是一种常用的消息负载格式。这种格式可以很好地表达资源的属性。
4.自描述消息
自描述消息是指消息本身包含足够的信息,从而使接受者能够理解消息的内容。这种消息清晰明了,无需外界解释就能被解析。
三、RESTful规范
RESTful规范是一种满足REST架构风格的API设计约束条件和规范,可以提供简单、可扩展、易于维护和易于升级的API设计方式。以下是RESTful规范的几个关键方面:
1.资源
任何可访问的对象都是资源,如用户、公司等。每个资源都具有自己的资源标识符,可以使用HTTP请求访问。
2.表现层
资源的表现层是指以某种表现形式呈现给客户端的内容,如JSON、XML等。资源的表现形式不受资源本身的状态影响。
3.状态转移
客户端通过向服务器发送请求并解析服务器的响应来以域模型为中心处理资源。资源上的状态可以通过HTTP方法来操作,如GET、POST、PUT、DELETE等。
四、REST接口
使用REST风格的API设计,需要注意以下事项:
1.资源的选择和命名
在设计RESTful API时,需要明确使用哪些资源标识符,以及如何命名它们。资源命名必须清晰、明确,并且易于理解和使用,以提高API的可用性和易用性。
2.合适的HTTP方法
在使用HTTP方法时,需要选择正确的方法,以便正确地表示资源上的操作。在使用GET方法时,应当对资源进行浏览、查找或检索。在创建资源时,应使用POST方法。在更新指定资源时,应使用PUT方法;如果只更新资源的一部分,则应使用PATCH方法。
3.状态码
HTTP状态码是RESTful API的一个重要组成部分,可以用来表示请求的成功和失败。常见的状态码有200(请求已成功,请求的数据包含在响应中)、201(成功请求并创建了新资源)、204(请求已成功,但没有返回数据)、400(客户端请求语法错误)、404(请求的资源不存在)、500(服务器内部错误)等。
4.副作用
RESTful API请求和响应应尽可能避免副作用。例如,在执行PUT请求时,不能产生新的资源或改变服务器状态。这些请求应该只是对现有资源进行更新。
代码示例
获取用户列表
GET /users
HTTP/1.1 200 OK Content-Type: application/json { "data": [ { "id": 1, "name": "Alice", "age": 22 }, { "id": 2, "name": "Bob", "age": 24 } ] }
创建一个新用户
POST /users
HTTP/1.1 201 Created Content-Type: application/json { "id": 3, "name": "Charlie", "age": 28 }
更新一个已有用户
PUT /users/1
HTTP/1.1 200 OK Content-Type: application/json { "id": 1, "name": "Alice", "age": 24 }
删除一个用户
DELETE /users/2
HTTP/1.1 204 No Content