什么是 REST API - 你需要知道的一切
本文最初发表于mariokandut.com。
REST 的全称是“ Representational State Transfer”(表示状态转移)。它是一种软件架构风格,定义了一组用于创建 Web 服务的约束。Roy Fielding于 2000 年在其论文中创建了这种架构风格。
所以,REST 是一种架构风格,或者说是一种 API 的设计模式。它依赖于一种无状态、客户端-服务器、可缓存的通信协议,基本上就是HTTP。如果你想更深入地理解,那么基于 HTTP 的万维网也可以被视为一种基于 REST 的架构。
当调用 REST API 时,服务器将向客户端发送请求资源的数据(状态表示)。
例如:当您向GitHub API发出请求以获取特定用户(= 请求的资源)时。该 API 将返回该用户的状态以及所有公开可用的信息。(通常,REST API 并不仅限于公开数据。)
让我们尝试一下:
// Make a request via fetch() or just type this URL in your browser
// https://api.github.com/users/{YOUR GITHUB USERNAME}
您将恢复个人资料中所有公开的信息。您可以在下方查看我的公开数据。
{
"login": "iepur1lla",
"id": 17470854,
"node_id": "MDQ6VXNlcjE3NDcwODU0",
"avatar_url": "https://avatars3.githubusercontent.com/u/17470854?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/iepur1lla",
"html_url": "https://github.com/iepur1lla",
"followers_url": "https://api.github.com/users/iepur1lla/followers",
"following_url": "https://api.github.com/users/iepur1lla/following{/other_user}",
"gists_url": "https://api.github.com/users/iepur1lla/gists{/gist_id}",
"starred_url": "https://api.github.com/users/iepur1lla/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/iepur1lla/subscriptions",
"organizations_url": "https://api.github.com/users/iepur1lla/orgs",
"repos_url": "https://api.github.com/users/iepur1lla/repos",
"events_url": "https://api.github.com/users/iepur1lla/events{/privacy}",
"received_events_url": "https://api.github.com/users/iepur1lla/received_events",
"type": "User",
"site_admin": false,
"name": "Mario Kandut",
"company": null,
"blog": "https://www.mariokandut.com",
"location": "Vienna, Austria",
"email": null,
"bio": "Software Developer with marketing background",
"public_repos": 47,
"public_gists": 1,
"followers": 14,
"following": 70,
"created_at": "2016-02-25T09:26:10Z",
"updated_at": "2019-11-04T16:13:02Z"
}
满足 REST 约束的 Web 应用程序称为RESTful应用程序。它公开请求资源的信息(在上面的 GitHub 示例中是用户信息)。但 REST 也允许您对资源执行操作。
RESTful 应用程序使用 HTTP 请求来创建数据、更新数据、读取数据和删除数据。因此,REST 的所有CRUD (创建/读取/更新/删除)操作都使用 HTTP 。
如果您遵循 REST 约束,您的 API 将更易于使用,更容易被新项目成员理解,甚至会对您未来的发展有所帮助。REST 还具有轻量级、平台无关(您无需关心服务器或客户端运行在什么操作系统上)和语言无关(C# 可以与 JavaScript 交互)等特点。
因此,要理解 REST,您需要了解HTTP 的基础知识。(是的,我将撰写一篇关于它的详细博客文章。)
您可能知道 HTTP 代表超文本传输协议 (Hypertext Transfer Protocol)。它是您当前用于阅读本博文或互联网上任何其他内容的通信协议。HTTP 本质上是一种基于消息的模型。每次交互都涉及请求和响应。
每个 HTTP 请求都必须有一个 URL,即所请求资源所在的地址。此外,该请求还包含一个方法,类似于 CRUD 模型。该方法指示应针对给定资源执行的操作。
HTTP 方法
这些HTTP 方法也称为 HTTP 动词。最常用的是:
- 该
GET
方法请求指定资源的表述。使用 GET 的请求应该仅检索数据。 - 该
POST
方法用于向指定资源提交实体,通常会导致服务器状态发生变化或产生副作用。POST请求应该用于发送数据并创建资源。 - 该
PUT
方法会将目标资源的所有当前表述替换为请求的有效负载。使用 PUT 的请求用于更新资源。 - 该
DELETE
方法删除指定的资源。
不太常用:
- 该
HEAD
方法要求的响应与GET请求的响应相同,但没有响应主体。 - 该
CONNECT
方法建立到目标资源所标识的服务器的隧道。 - 该
OPTIONS
方法用于描述目标资源的通信选项。 - 该方法沿着到目标资源的路径
TRACE
执行消息环回测试。 - 该
PATCH
方法用于对资源进行部分修改。
HTTP 状态代码
发送 HTTP 请求时,您也会收到响应。响应代码主要有以下四类:
1xx
:信息回复2xx
:成功响应3xx
:重定向消息4xx
:客户端错误响应5xx
:服务器错误响应
我建议记住这些代码和它们的含义,这在你调试时会很有帮助。
什么使 API 成为 Restful API
REST 定义了6 个架构约束,这使得任何 Web 服务都成为 RESTful API。
- 统一接口
- 客户端-服务器
- 无国籍
- 可缓存
- 分层系统
- 按需编码(可选)
统一接口
- 对服务器的请求必须包含唯一的资源标识符
- 服务器的响应包含足够的信息,以便客户端可以修改资源。
- 任何单一资源都不应太大,并且应包含其表示中的所有内容。 - 只要相关,资源就应包含指向相对 URI 的链接以获取相关信息。
- 此外,跨系统的资源表示应遵循某些准则,例如命名约定、链接格式或数据格式(xml 或/和 json)。
客户端-服务器
服务器和客户端也可以被替换和独立开发,只要它们之间的接口没有改变。
这意味着客户端应用程序和服务器应用程序必须能够独立发展,彼此之间没有任何依赖。客户端应该只知道资源的 URL,仅此而已。
无国籍
请求之间不应在服务器上存储任何客户端上下文。客户端负责管理应用程序的状态。
无状态在这里意味着服务器不记住任何关于使用 API 的客户端的信息。如果客户端应用程序需要成为面向最终用户的有状态应用程序(身份验证、授权),则每个请求都应包含所有必要的信息,包括身份验证和授权详细信息。
可缓存
管理良好的缓存可以部分或完全消除一些客户端与服务器之间的交互,从而进一步提高可扩展性和性能。
在 RESTful 架构中,缓存应该应用于资源,如果适用,这些资源必须声明自己可缓存。缓存可以在服务器端或客户端实现。
分层系统
REST 允许您使用分层系统架构。在发送请求的客户端和发送响应的服务器之间,可能存在多个服务器。这意味着您可以在服务器 A 上部署 API,在服务器 B 上存储数据,并在服务器 C 上验证请求。此外,还可以添加安全层、缓存层、负载均衡层或其他层/功能。
按需编码(可选)
此约束是可选的。在大多数情况下,您将以 XML 或 JSON 格式发送资源的静态表示,但您可以返回可执行代码来支持应用程序的一部分。
简而言之
REST 是一种 API 架构风格,它定义了如何请求和接收数据。要构建真正的 RESTful API,需要遵循一系列约束。要理解 REST,您需要了解 HTTP 方法和 HTTP 状态码。
我希望我能为 REST 的黑暗角落带来一些光明,并且一如既往,如果您有任何疑问,请使用评论功能或在 Twitter 上向我发送消息@mariokandut。
以下是一些帮助您学习 RESTful API 的文章:MDN HTTP 方法、MDN HTTP 状态代码、wikipedia、RESTfulapi.net、Shif Ben Avraham、Goran Aviani、Preethi Kasireddy。
文章来源:https://dev.to/mariokandut/what-is-a-rest-api-everything-you-need-to-know-1g6c