前言
什么是REST API?REST是Representational State Transfer(表现层状态转移)的缩写 - 对最常用的网络服务技术几乎是毫无意义的描述。REST API是两个计算机系统在web浏览器和服务器中使用HTTP技术进行通信的一种方式。
在两个或多个系统之间共享数据一直是软件开发的一个基本要求。比如说,考虑购买汽车保险。你的保险公司必须获得关于你和你的车辆的信息,所以他们要求从汽车登记机构、信贷机构、银行和其他系统获得数据。所有这些都是实时透明地发生的,以确定保险公司是否能提供一个有竞争力的保单。
API(应用程序接口)通过为系统之间的对话提供接口来帮助这种类型的通信。REST只是一种被广泛采纳的API风格,我们用它来与内部和外部以一种一致的和可预测的方式进行沟通。它可以比作我们以前寄信时用邮票、地址和信封的方式,以确保信件被送达和阅读。
REST是人们在web系统中常用的交互方式。例如,在一个社交媒体应用中检索和更新账户信息。
REST API示例
在你的浏览器中打开以下链接,从Open Trivia Database中请求一个随机的计算机问题:
https://opentdb.com/api.php?amount=1&category=18
这是一个作为RESTful网络服务实现的公共API(它遵循REST公约)。你的浏览器将展示一个单独的JSON格式的问答问题,并附有答案。比如说:
{
"response_code": 0,
"results": [
{
"category": "Science: Computers",
"type": "multiple",
"difficulty": "easy",
"question": "What does GHz stand for?",
"correct_answer": "Gigahertz",
"incorrect_answers": [
"Gigahotz",
"Gigahetz",
"Gigahatz"
]
}
]
}
你可以使用任意HTTP客户端,来请求同样的URL并得到响应,比如使用curl:
curl "https://opentdb.com/api.php?amount=1&category=18"
HTTP客户端库可以在所有流行的语言和运行时中使用,包括JavaScript、Node.js和Deno中的Fetch以及PHP中的file_get_contents()。JSON响应是机器可读的,因此可以在输出HTML或其他格式之前被进行解析和使用。
REST APIs和Rest
多年来,各种数据通信标准已经发展起来。你可能遇到过的选择包括CORBA,SOAP,或者 XML-RPC。大多数都确定了严格的消息传递规则。
REST是由Roy Fielding在2000年定义的,比其他的要简单得多。它不是一个标准,而是一套关于RESTful网络服务的建议和约束。其中包括:
客户服务器分离模式(Client-Server):系统A向系统B托管的URL发出HTTP请求,并返回一个响应。这与浏览器的工作方式相同。浏览器对一个特定的URL发出请求,该请求被转发到一个web服务器,该服务器通常返回一个HTML页面。该页面可能包含对图片、样式表和JavaScript的引用,从而产生进一步的请求和响应。
无状态(Stateless):REST是无状态的:客户端请求应该包含响应所需的所有信息。换句话说,应该可以按照任何顺序发出两个或更多的HTTP请求,并且会收到相同的响应(除非API被设计为返回随机响应)。
可缓存(Cacheable):响应应该被定义为可缓存或不可缓存。缓存可以提高性能,因为没有必要为同一个URL重新生成一个响应。在某个时间段特定于某个用户的私人数据通常不会被缓存。
分层(Layered):请求的客户端不需要知道它是否在与实际的服务器、代理或任何其他中间人进行通信。
创建RESTful网络服务
一个RESTful网络服务请求包括:
端点URL。实现RESTful API的应用程序将定义一个或多个带有域名、端口、路径、和/或查询字符串的URL端点,例如,https://mydomain/user/123?format=json。
HTTP方法。不同的HTTP方法可以在任何端点上使用,这些方法映射到应用程序的创建、读取、更新和删除(CRUD)操作:
HTTP方法
CRUD
行为
GET
读取
返回请求数据
POST
创建
创建一个新记录
PUT 或者 PATCH
更新
更新已存在的记录
DELETE
删除
删除已存在的记录
比如:
对/user/的GET请求返回系统中的注册用户列表。
对/user/的POST请求使用body对象创建了一个ID为123的用户。该响应会返回ID。
对/user/123的PUT请求使用body对象更新用户123。
对/user/123的GET请求返回用户123的详情。
对/user/123的DELETE请求删除用户123。
HTTP头部。认证令牌或cookies等信息可以包含在HTTP请求头中。
Body对象。数据通常在HTTP主体中传输,该方式与HTML