在本系列的最后一篇文章中,您将学习Java和Spring Web Services的REST API建议和开发示例。
开发良好的REST API时,拥有良好的微服务很重要。
您如何开发REST API? 最佳做法是什么?

您将学到:
- 如何开发一个好的REST API?
- 开发REST API时应该考虑些什么?
- 开发RESTful Web服务的最佳实践是什么?
REST API
这是有关REST API的系列文章中的最后一篇:
使用消费者至上的方法
谁来使用您的服务? 消费者服务。
您从消费者的角度看服务吗?
- 如果您正在开发API,那么您的消费者可以理解您的API吗?
- 如果发布资源,那么消费者可以找到并访问它们吗?
- 消费者可以理解您的URI吗?
- 您提供什么类型的服务?
- 这是移动应用程序还是Web应用程序?
- 您期望什么消费者,这些类型的消费者将来会改变吗?
- 如果您要实现HATEOAS之类的东西,请在实现之前考虑客户如何使用它。
- 最重要的是要拥有出色的文档
- 让客户更轻松地节省时间。
- 消费者可以自己做的越多,为您工作的次数就越少。
每当您进行讨论或进行服务审核时,都将客户要求放在首位。
使用合同优先方法
什么是合约?
Web服务的创建者被认为
是服务提供者 。 使用Web服务的应用程序是该服务的
使用者 。
合同是提供者和消费者之间关于服务的协议。

为了正确使用服务,服务的使用者必须完全了解合同。 该合同包括服务的许多方面的详细信息,例如:
- 如何调用网络服务?
- 使用哪种交通工具?
- 请求和响应结构是什么?
这也称为
服务定义 。
在“合同优先”方法中,首先定义服务合同,然后仅实施服务。
与WSDL首先签订合同
例如,当您定义SOAP Web服务时,您将使用WSDL来定义合同。

WSDL确定什么是服务端点,您发布的操作以及请求和响应结构。
首先使用Swagger / Open API签约
当您使用RESTful Web服务时,Swagger是用于记录Web服务的流行工具。


Swagger可让您确定作为API一部分提供的资源。 它包括每个操作的详细信息,例如,是否使用XML,JSON或同时使用两者。 答案大纲也在那里。

它还提供了有关其支持的响应代码的详细信息。 您还可以看到
/ jpa / users这个特定资源:

支持GET操作。 实际上,它还支持POST操作:

如果此资源可用,则响应方案将是:

Swagger协议中对User对象的定义如下:

它包括属性:
birthDate ,
id ,
name和帖子消息数组。 一些字段在其中还包含描述字段。
在合同优先方法中,在实施服务之前,您可以手动或使用应用程序创建Swagger创建的定义。
合同优先法的好处
使用“合同优先”方法,您会考虑客户以及他们如何使用此服务。 您最初并不担心实现细节。
如果您在早期阶段就非常重视实现,那么技术细节会渗透到服务的定义中。
您需要确保服务的定义不依赖于所使用的平台(Java,.NET或任何其他平台)。
定义REST API的组织标准
YARAS是组织标准的重要指南。

YARAS代表的是
另一个RESTful API标准 。 YARAS提供了开发RESTful Web服务时必须遵循的标准,准则和约定。 他针对以下事项提供建议:
- 您应该给服务起什么名字
- 您应该如何组织您的请求和响应
- 您应如何实施过滤,排序,分页和其他操作
- 您应该如何进行版本控制
- 您如何处理API文档
统一的服务开发方法
在开始设计RESTful Web服务之前,您需要解决许多复杂的问题。 以上所有,您需要找出。
您组织的领导层不会希望处理不同资源的团队对这些事情采用不同的方法。
例如,不希望Team-A根据查询参数组织版本控制,而Team-B使用基于URI的版本控制。
因此,为RESTful Web服务方法明确定义组织标准非常重要。
根据组织需求定制YARAS
YARAS的优点在于可以对其进行自定义以满足组织特定的需求。 例如,您可以:
由于YARAS具有相当全面的覆盖范围,因此可以确保您没有错过任何重要的决定。
选择标准的企业框架REST API框架
在Java世界中用于创建RESTful Web服务的典型框架是Spring MVC,Spring REST和JAX-RS。
如果您在首选的REST API平台之上创建符合通用组织标准的特定于组织的框架/原型/参考应用程序,这将使团队可以轻松遵守通用标准。
典型功能包括:
- 请求和响应结构
- 错误处理
- 过滤
- 搜寻
- 版本控制
- 错误答案支持
- Hateoas
标准框架为在整个组织中设计和实施服务提供了统一的方法。
分散式REST API管理
从创建REST API的团队中创建专家组,并组成管理团队。 团队负责
- 改善REST API标准
- 构建/设计REST API框架
HTTP的广泛使用
每当您想到RESTful Web服务时,就想到HTTP。
HTTP具有帮助您创建出色的Web服务的所有功能。
使用正确的HTTP请求方法
考虑一下您需要使用的HTTP请求方法。 考虑实现一项操作时,请确定应在其上执行的资源,然后找到适当的HTTP请求方法。 您是检索详细信息,创建内容,更新现有内容还是删除现有内容?
使用HTTP方法:
- 得到得到
- 开机自检创建
- 放置更新
- 删除删除
- 修补程序以进行部分更新
使用适当的HTTP响应状态
执行操作时,请确保返回正确的响应状态。
例如,当找不到特定资源时,请勿引发服务器异常。 而是在响应消息中发送适当的响应代码,例如
404 。
如果确实存在服务器异常,则将代码
500发送回去。
如果验证失败,请发送无效请求的代码。
专注于表现
每个资源可以有几种表示形式-XML或JSON格式。 服务使用者可以选择自己选择的表示形式。
当我们发送GET请求时,该服务将返回3个用户。 在这种情况下,我们获取
/ users资源的JSON表示形式。

当使用者未指示首选视图时,我们使用JSON。

使用者可以发送Accept标头来指示视图。

响应主体现在具有XML内容:

使用复数
在命名资源时,请始终使用复数形式。
让我们看一个简单的例子。 假设我们有一个托管用户资源的服务。 下面介绍如何访问它们:
- 创建用户: POST /用户
- 删除用户: DELETE /个用户/ 1
- 获取所有用户: GET /用户
- 获取一个用户: GET / users / 1
多个用户优先于用户用户使URI更具可读性。
- 例如,如果我们使用/ user而不是/ user来获取,则GET / user不会将正确的消息传递给阅读器。
创建好的文档
消费者需要了解如何充分利用服务,而帮助他们的最佳方法是创建良好的文档。
SOAP Web服务可以使用WSDL功能,而RESTful Web服务具有Swagger选项(现在是Open API文档标准)。
选择格式只是创建好的文档的一部分。 同样重要的是提供适量的信息来帮助消费者。
该文档应完整,并包括以下几点:
- 什么是请求和响应结构?
- 消费者应如何认证自己?
- 使用限制是什么?
- 指出服务可能期望的所有类型的响应消息和相应的状态代码。
创建一个通用的REST API文档门户
为整个组织使用通用的REST API文档门户会很有帮助。 看一看这样的门户:

这样的门户汇集了组织中所有可用的资源。 拥有Swagger UI之类的用户界面将带来更多好处。 使用Swagger UI,您可以更详细地查看文档:

即使非技术用户也可以使用此功能。 此处提供的信息包括:
实时请求/响应样式的文档格式也可能是您感兴趣的。
版本支持
版本控制给Web服务带来了极大的复杂性。 维护同一Web服务的多个不同版本非常困难。 尽可能避免这种情况。
但是,在某些情况下,版本控制是不可避免的。
让我们从一个示例服务开始。 假设我们最初定义了一个具有
PersonV1类的服务,如下所示:
该类的版本不考虑名称可以包含许多子节,例如名字和姓氏。 检查一下:
源类的第二个版本已更新,可以解决此异常问题:
我们无法立即将整个服务转让给使用
PersonV2 ! 可能还有其他消费者正在等待
PersonV1格式的响应。
这是需要版本控制的地方。
现在,让我们看一下对这两种资源进行版本控制的选项。
使用不同的URI
我们有一个选择-对这些不同的资源使用不同的URI。 在下面的考试代码中,我们使用URI
v1 / person和
v2 / person来区分它们:
如果您对资源
v1 / person执行GET请求:

您将收到与
v1相对应的信息。 对于另一资源:

使用查询参数
第二种版本控制方法使用查询参数:
在URI
/ person / param中 ,如果我们发送
version = 1的参数,则会返回
PersonV1类型的资源:

对于相同的URI,
version = 2的参数返回类型为
PersonV2的资源:

该方法称为使用查询参数的版本控制。
使用标题(标题)
可以执行此操作的另一种方法是通过指定标题来进行版本控制。 在这里,我们使用名为
X-API-VERSION的标头,并将URI标记为
/ person / header 。 当标头值为
1时 ,
返回PersonV1类型的资源:

当其值为
2时 ,将检索类型为
PersonV2的资源:

我们使用请求标头中的属性为我们执行版本控制。
使用接受标题
创建版本的最终方法是使用“接受标头”。 如果使用者在GET请求的“接受标头”中包含第一个版本信息,则返回以下资源:

否则,
返回PersonV2类型的资源:

此版本控制方法称为“
接受标头版本控制”或“
媒体类型版本控制” ,因为MIME类型通常是Accept标头的内容。
版本控制方法的比较
到目前为止,我们已经在版本中看到了四种类型的方法:
- 使用不同的URI
- 使用查询参数
- 标头的使用
- 使用接受标题/媒体类型
哪一个最好? 事实是,这个问题没有单一答案。 事实是,不同的互联网巨头光顾了不同类型的版本。
- 使用不同的URI-Twitter
- 使用查询参数-Amazon
- 使用标题-Microsoft
- 使用接受标题/媒体类型-GitHub
您需要根据您的特定需求评估这四个选项。 有许多重要因素需要考虑:
- URI污染 :通过使用URI和查询参数控制版本,我们最终污染了URI空间。 这是因为我们在URI的主字符串中添加了前缀和后缀。 使用标头进行版本控制可以避免这种情况。
- HTTP标头的滥用 。 在使用标头和媒体类型进行版本控制的情况下,会误用HTTP标头,因为它们最初并不是用于版本控制的。
- 缓存 :资源由其URI标识。 但是,如果您不使用URI来确定其版本,而是使用基于标头的机制,则无法缓存版本信息。 如果HTTP缓存对您很重要,请使用基于URI或request参数的版本控制。
- 浏览器请求可执行性 :基于标题和媒体类型的版本控制需要Postman之类的工具。 但是,如果服务使用者在技术上并不精通,则最好使用基于URI或查询参数的版本控制。
- API文档 :您还需要考虑如何记录API。 与其他两种类型的版本控制相比,基于URI和查询参数的版本控制更易于记录。
了解没有单一的理想解决方案!
考虑错误处理
消费者向服务提交请求时,重要的是要获得正确的答案。 每当出现问题时,发送适当的响应很重要。
当使用者请求不存在的资源时
如果我们发送GET请求来搜索现有用户,则会收到以下响应:

如果您正在寻找不存在的用户:

您得到的是
404 Not Found状态。 这是一个很好的错误处理方法,因为它可以正确确定未找到资源,并且不返回服务器错误。
现在,我们将GET请求发送到不存在的URI:

如您所见,您将获得
404 Not Found响应状态。 URL无效表示资源不存在。
重要回复状态
- 200-成功
- 404-找不到资源
- 400-无效的请求(例如,验证错误)
- 201-创建
- 401-未经授权(如果身份验证失败)
- 500-服务器错误
响应正文中的错误详细信息
如果在开发服务时具有标准的异常结构,这将有所帮助。

对于特定的错误,可以将特定的响应结构返回给消费者,这可能是整个组织的标准。 确保错误响应也对消费者可读,而不会引起混淆。
使用Swagger或Open API文档
Swagger为RESTful Web服务提供了最受欢迎的文档格式之一。 今天,它得到了各种组织的支持,并用于大量服务中。 这里我们看一下Swagger的两个主要方面:
- Swagger文档格式
- Swagger UI,可让您以视觉上方便的方式查看Swagger文档
Swagger文档
看一下下面的Swagger JSON:

在顶层,这看起来与WSDL的定义非常相似。 它具有几个重要属性:
- 主机 :服务所在的位置
- basePath :服务所在的路径
- 消耗 :接受什么请求


- path :各种可用资源在这种情况下,列表中有几种资源:

查看Swagger文档时,您可以快速确定可用资源,支持的操作以及与每个资源相关的操作:
/ users资源支持
GET和
POST操作。 对于
GET,您可以查看受支持的请求和响应类型。 您还会看到各种类型的答案:

注意,对于答案
200,该电路也称为
用户阵列。
用户是文档底部的“
定义”部分的一部分:

Swagger完全独立于用于实现RESTful Web服务的技术。 哦,一切都基于JSON。
Swagger UI简介
Swagger UI是一个很棒的用户界面,对于可视化RESTful Web服务的Swagger文档非常有用。 :

, - . :

, :

, URL :

GET , :

, .
birthDate ,
id ,
links ,
name posts . :

Swagger ( Open API)
Swagger — , . , , : :

Swagger contract-first, code-first.
.
RESTful -.
Be the BEST at Your REST API!Developing REST APIs