本文,将从REST API的创建者和使用者的角度来向大家介绍什么是 REST API。
API代表应用程序编程接口,它是一个用于标识不同事物的总称。
我们了解了浏览器如何以可用函数的形式提供一些APIs。
我们看到Node.js如何为我们提供一个带有其默认模块的编程API。
API还意味着另一件事:创建公开某些特定功能的服务,这些功能是通过可由多个客户机访问的服务器提供的。
一般来说,我们目前有两类APIs: REST APIs和GraphQL APIs。
其他类型的API范例也存在,比如SOAP,但是它们在JavaScript世界中不是很流行。
在这篇文章中,我们将讨论REST APIs。
端点
在REST API中,我们创建了许多客户机可以访问的端点。
假设我们想要暴露一个人的名单。我们可以创建一个端点来响应/people路由。
如果我们的服务在域test.com上侦听,我们就会有test.com/people URL。
这个端点将以任何格式提供数据,但通常我们使用JSON,这是一种方便的基于文本的格式,用于在两个服务之间通信数据。
这个/people端点可以提供人名列表和每个人的id。例如,这可能是我们用来在数据库中存储它们的id。
我们的系统还可以公开另一个端点,我们可以调用/person。它接受一个唯一标识一个人的id,就像这样:/person/1
我们的API将提供关于此人的更多信息,例如年龄、电子邮件、地址。
需要注意的重要一点是,在第一个端点中我们没有任何参数,但这次我们有一个。
参数可以以不同的方式发送,并不是所有的端点都将用于从服务器发送信息。我们很快就会看到,将使用其他一些端点来执行操作。
方法
我提到过/people端点将返回系统中的人员列表。
这是一个简化,现在是深入挖掘的时候了。
REST API使用HTTP协议原则根据所使用的HTTP方法提供不同的功能:GET、POST、PUT、DELETE。
GET是最常见的一种。当客户端使用GET方法调用我们的API端点时,它会发出想要读取数据的信号。
GET /people将返回一个人员列表。
GET /person/1将返回一个人的详细信息。
当HTTP方法是POST时,含义完全不同。端点是相同的,但是所需的操作是另一个端点。
例如,我们可以创建POST /person端点,当调用该端点时,将在数据库中创建一个新的person。
它从客户端接收数据,以我们可以选择的预定义格式。我们很快就会看到一个使用Express的例子。
GET和POST是最常用的两个动词。
有时我们使用PUT和DELETE: PUT有时用于更新资源,比如更改某人的地址。DELETE用于删除资源。
其他时候,POST用于非查看内容,而GET用于查看内容。
我们可以随便选择。
我们所说的资源指的是一个实体,例如复数形式的人 /people ,或者单数形式人 /person 。
命名API端点
上节中的/people和/person。
这些都是名词。
使用名词作为端点,并使用HTTP方法作为动作的信号,被认为是一种最佳实践。
更新person使用到/person端点的POST请求。
如果您想创建一个API来将消息发送给一个人,您可以使用一个/message端点发出一个POST请求,将数据传递给它来识别这个人和您想发送的消息。
无状态性
REST API是无状态的。
这意味着在不同的请求之间没有任何存储。
但是大多数API都实现了一种API键机制,用于跟踪谁在调用API,并提供一种监视使用和强制限制的方法。
还可以使用登录/密码机制来保护API。在这种情况下,API身份验证过程需要考虑握手过程,握手过程提供一个token,在以后的每个请求中都需要发送这个令牌,以识别用户和正确的授权。
响应
API调用将以两种形式向用户返回响应:HTTP响应状态代码和HTTP响应主体。
每个HTTP请求都有一个状态码。
我们有一些关于HTTP响应状态代码的约定:当您使用浏览器打开一个web页面时,页面将返回一个200 OK状态码,如果页面没有找到,则显示404 not found状态码。
常见状态码如下:
- 200 OK: HTTP请求响应成功。
- 201 Created:通常是对POST请求的响应。代表请求已经完成,并且创建了一个新的资源。
- 400 Bad Request:由于在客户端生成的请求错误,服务器无法处理请求。错误可能包括格式不正确的请求、或其他。
- 401 Unauthorized:当需要身份验证时客户端未授权。
- 403 Forbidden:由于各种原因,资源不可用,如果原因是身份验证,请选择401未授权状态代码。
- 404 Not Found:找不到所请求的资源。
- 405 Method Not Allowed:该资源通过该HTTP方法不可用,但可能与其他方法一起可用。
- 500 Internal Server Error:内部服务器错误一个通用的服务器错误消息,当遇到意外情况时给出,没有更具体的消息是合适的。
响应体通常是以JSON格式响应,包含所请求的数据或一条错误消息。