Module 03 · Express Web Application FrameworkExpress Web 应用框架
HTTP Methods and REST APIsHTTP 方法与 REST API
预计所需时间:30 分钟
目标
阅读本文档后,您应该能够:
- 定义与HTTP方法相关的术语
- 解释编写REST APIs的指南和最佳实践
互联网依赖于客户端-服务器架构。最终用户与客户端进行交互,而服务器则存储操作应用程序、业务逻辑和数据的服务1。客户端与服务器进行通信,以实现最终用户所需的功能。数据通过超文本传输协议进行客户端和服务器之间的传输,更常见的称为HTTP2。这种通信通常通过API3进行。在2000年,开发了一套用于为客户端-服务器架构编写这些API的指南,称为REST4 API。
“REST”的缩写代表表述性状态转移。在更详细地解释这个术语之前,让我们先讨论HTTP方法和一些术语。
在客户端/服务器架构中,应用程序由一个或多个驻留在服务器上的服务组成。这些服务包含资源5。客户端通过使用具有服务内端点9的路由8的请求对象7向资源发出请求6。应用程序向客户端发送响应对象10,以响应11该请求。
请求对象包含三个部分:URL12、请求头13和请求体14。服务器使用URL来识别被操作的服务及其内的端点。URL包含四个部分:协议15、主机名16、路径17和查询字符串18。请求头包含有关请求客户端资源的元数据,例如用户代理19、主机20、内容类型21、内容长度22以及客户端在响应中应期待的数据类型。
服务器以包含头部23、主体24和状态码25的响应对象进行响应。响应对象的主体通常包含一个JSON26 有效负载27,以将数据返回给客户端。
在REST API中,可以使用多种HTTP方法来允许客户端与服务之间的交互。最常用的方法是GET28、POST29、PUT30、DELETE31和PATCH32。
方法的名称描述了当应用该方法时资源会发生什么。如果多次调用相同的API方法,PUT和DELETE方法将产生幂等33的数据。
HTTP有三种传递参数的方式:URL路径参数34、URL查询参数35和头部参数36。路径和查询参数作为URL的一部分传递,而头部参数则由浏览器直接传递给服务。
当服务完成请求时,它会返回响应。HTTP状态码应成为该响应的一部分。HTTP状态码指示响应是否已完成。响应代码类别如下表所示。
| 状态码范围 | 含义 |
|---|---|
| 200-299 | 一切正常 |
| 300-399 | 资源已移动 |
| 400-499 | 客户端错误 |
| 500-599 | 服务器错误 |
如前所述,REST是一组指南。要使API被视为RESTful,必须满足五个要求,以及一个可选标准:
- API利用由通过HTTP管理和交付的资源组成的客户端-服务器架构。
- 客户端与服务器之间的通信是无状态37的。
- 数据是可缓存38的,以提高客户端的性能。
- 接口以标准格式传输,以便存储在服务器上的请求资源与发送给客户端的表示分开。发送给客户端的表示包含足够的数据,以便客户端可以操作该表示。
- 请求和响应通过不同的层进行通信,例如中间件39。客户端和服务器通常不会直接相互通信。
- (可选)资源通常是静态的,但也可以包含可执行代码。代码应仅在客户端请求时执行。
当客户端发出请求时,它还必须将其状态信息传递给服务器。客户端与服务器之间的每次通信都应包含执行请求所需的所有信息。客户端而不是服务维护状态。每个请求必须包含必要的信息,以便服务器理解请求。因此,例如,如果用户正在查看数据库记录并且该记录需要更新,客户端还必须发送需要更新的记录。服务器不知道当前正在查看哪条记录。
在定义RESTful服务时使用@app.route()方法。该方法接受两个参数:从URL到被操作服务的路由,以及一个可选的HTTP方法参数,例如POST、GET等。路由参数可以包括变量,例如<username>。路由的根由/表示。例如,如果您希望路由为www.mywebsite.com/accounts,则只需在@app.route()函数中指定/accounts作为路由参数。
REST API具有以下特征:
- 基于资源;也就是说,它们描述一组资源
- 仅包含名词,而不包含动词
- 当提到单个资源时使用单数名词,提到资源集合时使用复数名词
- 始终通过URL进行标识
| 非RESTful APIs | RESTful等效 |
|---|---|
| GET http://api.myapp.com/getUser/123 | GET http://api.myapp.com/users/123 |
| POST http://api.myapp.com/addUser | POST http://api.myapp.com/users |
| GET http://api.myapp.com/removeUser/123 | DELETE http://api.myapp.com/users/123 |
URL格式指南
- 应使用斜杠
/表示目录结构中的层次关系 - 应避免使用尾随斜杠,例如/resource/
- 应使用连字符,而不是驼峰式,例如/my-resource,而不是/myResource
- 应不在URL中使用下划线
_,例如/my-resource,而不是/my_resource - 应使用小写字母
- 应不在URL中使用句点
. - URL中可以包含多个从属资源和ID,例如GET /resource/{id}/subordinate/{id}
术语和定义
| 术语 | 描述 |
|---|---|
| 1.服务 | 构成应用程序一部分的软件组件,具有特定目的。通常,服务从客户端或其他服务获取输入并生成输出。 |
| 2.HTTP | 互联网中用于获取或交换资源数据的客户端-服务器架构所使用的协议。 |
| 3.API | 应用程序编程接口是一组定义和协议,允许两个服务相互通信。API请求可以在资源之间交换的数据和从该资源返回的结果。 |
| 4.REST | 一组架构指南,描述如何编写两个组件之间的接口(API),通常是客户端和服务器,描述这些组件如何相互通信。REST代表表现层状态转移。REST描述了一种标准方式来识别和操作资源。REST确保客户端和服务器之间传递的消息是自描述的,并定义客户端如何与服务器交互以访问服务器上的资源。 |
| 5.资源 | 资源是RESTful API的基本概念。它是具有定义类型、相关数据、与其他资源关系以及可以对其操作的一组方法的对象。资源通常以JSON格式定义,但也可以是XML。 |
| 6.请求 | 客户端向服务器上的主机发出的请求,以访问资源。客户端使用URL的一部分来确定从资源中所需的信息。最常见的请求方法包括GET、POST、PUT、PATCH和DELETE,还包括HEAD、CONNECT、OPTIONS、TRACE和PATCH。 |
| 7.请求对象 | 包含HTTP请求数据。它包含三个部分:URL、头部和主体。 |
| 8.路由 | HTTP方法与从路径根部到资源的路径的组合。 |
| 9.端点 | 由REST API指定的在服务器上访问的资源位置。通常通过API的HTTP方法中的URL来识别。 |
| 10.响应对象 | 包含对请求的HTTP响应数据。它包含头部、主体和状态。 |
| 11.响应 | 由服务器发出并发送给客户端,以提供客户端请求的资源,告知客户端请求的操作已完成,或让客户端知道处理请求时出现错误。 |
| 12.URL | “统一资源标识符”与URL一词可以互换使用。它们是RESTful API的一部分,用于定位请求资源的端点,并包含关于如何操作该端点的数据。客户端使用URI/URL发出HTTP请求以操作资源。它们应由四个部分组成:主机名、路径、头部和查询字符串。 |
| 13.请求头 | 传递给服务器关于检索到的资源或请求客户端的信息。示例包括: • 方法与端点:POST /car-reviews • 用户代理:客户端使用的浏览器类型。 • 主机:网络上与其他主机通信的计算机。 • 内容类型:资源的媒体类型,如文本、音频或图像。 • 内容长度:响应中发送的数据字节数。 • 接受编码:预期返回的数据格式,例如application/json • 连接信息 |
| 14.请求主体 | 提供传递给服务器的数据。 |
| 15.协议 | 告诉服务数据如何在服务器和客户端之间传输。 |
| 16.主机名 | 网络上设备的名称,通常也称为站点名称。 |
| 17.路径 | 路径标识服务中资源的位置及其端点。例如:https://www.customerservice/customers/{customer_id} |
| 18.查询字符串 | URL中包含查询的部分。 |
| 19.用户代理 | 客户端使用的浏览器类型。 |
| 20.主机 | 网络上与其他主机通信的计算机。 |
| 21.内容类型 | 资源的媒体类型,如文本、音频或图像。 |
| 22.内容长度 | 响应中发送的数据字节数。 |
| 23.响应头 | 包含关于响应的元数据,如时间戳、缓存控制、安全信息、内容类型和响应主体中的字节数。 |
| 24.响应主体 | 请求的资源的数据被发送回客户端。 |
| 25.响应状态 | 返回代码,向客户端传达请求的状态结果。 |
| 26.JSON | “JavaScript对象表示法”是一种存储和传输数据的格式,通常用于将数据从服务器上的服务发送到客户端。它由键值对组成,并且是自描述的。JSON数据的格式与创建JavaScript对象的代码相同,使得将这些数据转换为JavaScript对象变得容易,但可以用任何编程语言编写。JSON有三种数据类型:标量(数字、字符串、布尔值、null)、数组和对象。 |
| 27.有效负载 | 有效负载是由于API请求而从服务器传输到客户端的响应主体中的数据。 |
| 28.GET | GET方法用于检索资源的表示。GET()不应修改资源,仅返回请求资源的表示。 |
| 29.POST | 将数据发送到服务器以创建资源的HTTP方法,应返回201_CREATED状态码。 |
| 30.PUT | 更新资源或替换现有资源的HTTP方法。连续多次调用PUT不会产生副作用,而POST会。如果资源存在并可以更新,应返回200_OK代码;如果资源不存在,应返回404_NOT_FOUND代码。 |
| 31.DELETE | 删除资源的HTTP方法,如果资源存在并可以被服务器删除,则返回204_NO_CONTENT;如果资源无法找到,意味着它已被删除。 |
| 32.PATCH | 对资源应用部分修改的HTTP方法。 |
| 33.幂等 | 描述在进行多次相同请求时保持不变的集合元素。如果多次调用相同的API方法,PUT和DELETE方法会产生幂等数据。 |
| 34.URL路径参数 | 作为URL路径中的变量由客户端传递给操作。 |
| 35.URL查询参数 | 包含键值对,通常以JSON格式表示,并通过'?'与路径分隔。如果有多个键值对,应通过'&'分隔。查询可用于传递要应用于操作返回结果的过滤器。 |
| 36.头部参数 | 包含关于查询的附加元数据,例如识别调用操作的客户端。 |
| 37.无状态 | 客户端向服务器请求资源的所有请求都是相互隔离的。服务器对客户端的应用状态一无所知,因此需要在每个请求中传递该信息。 |
| 38.可缓存 | 在客户端存储数据的能力,以便在未来的请求中使用该数据。 |
| 39.中间件 | 位于应用程序、数据库或服务之间的软件,允许这些不同技术进行通信。 |