当前位置: 首页 > 科技观察

【API架构】RESTAPI设计原则与实践

时间:2023-03-17 14:20:05 科技观察

这篇最佳实践文章面向有兴趣创建跨多个服务套件提供高可靠性和一致性的RESTfulWeb服务的开发人员;遵循这些指南;定位为内部和外部客户快速、广泛、开放地采用的服务。这是一个完整的图表,可以轻松理解RESTAPI的原理、方法和最佳实践。下面,我们就从各个盒子的原理入手,进行详细的讲解。六个原则/约束客户端-服务器:关注点分离是客户端-服务器约束背后的原则。通过将用户界面问题与数据存储问题分开,我们提高了跨多个平台的用户界面的可移植性,并通过简化服务器组件提高了可扩展性。无状态:通信必须是无状态的,如客户端-无状态-服务器(CSS)样式。从客户端到服务器的每个请求都必须包含理解请求所需的所有信息。因此,会话状态完全保留在客户端上。可缓存:为了提高网络效率,我们添加了缓存约束以形成客户端缓存无状态服务器样式。缓存约束要求数据响应隐式或显式标记为可缓存或不可缓存的请求。如果响应是可缓存的,则客户端缓存有权为以后的等效请求重用该响应数据。分层系统:客户端常常分不清是直接连接到终端服务器还是一路上的中介。中间服务器可以通过启用负载平衡和提供共享缓存来提高系统的可扩展性。层还可以执行安全策略。按需代码:REST允许通过下载和执行小程序或脚本形式的代码来扩展客户端功能。通过减少需要预先实现的功能量来简化客户端。它允许在部署后下载功能,增加系统的可扩展性。统一接口:通过将通用的软件工程原理应用于组件接口,简化了整个系统架构,提高了交互的可见性。实现与它们提供的服务是分离的,这鼓励了独立的演进性。REST定义了四种接口约束:资源标识、通过表示对资源的操作、自描述消息以及作为应用程序状态引擎的超媒体。自描述消息:每条消息都包含足够的信息来描述如何处理消息。基于资源:在请求中使用URI作为资源标识符来标识单个资源。资源本身在概念上与返回给客户端的表示分离。通过表示操作资源:当客户端表示资源(包括任何附加的元数据)时,它有足够的信息来修改或删除服务器上的资源,前提是它有这样做的权限。超媒体作为应用程序状态引擎(HATEOAS):客户端通过文字内容、查询字符串参数、请求标头和请求的URI(资源名称)传递状态。服务通过文本内容、响应代码和响应标头向客户端提供状态。最佳实践现在,让我们换个话题,看看每个工程师都应该知道的REST基本最佳实践。保持简单和细粒度:创建模仿系统底层应用程序域或系统数据库模式的API。最终,您将需要聚合服务——利用多个底层资源来减少聊天的服务。过滤和排序:对于大型数据集,从带宽角度限制返回的数据量至关重要。此外,我们可能希望指定要包含在响应中的资源的字段或属性,从而限制返回的数据量。我们最终是想查询具体的值,并对返回的数据进行排序。版本控制:在API开发中有很多方法可以破坏契约并对客户产生负面影响。如果您不确定更改的后果,最好谨慎行事并考虑版本控制。在决定新版本是否合适或对现有表示的修改是否充分和可接受时,需要考虑几个因素。因为维护多个版本变得乏味、复杂、容易出错且成本高昂,所以对于任何给定资源,您应该支持不超过两个版本。缓存:缓存通过使系统中的层消除远程调用来检索请求的数据来增强可伸缩性。服务通过在响应上设置标头(例如Cache-Control、Expires、Pragma、Last-Modified等)来提高可缓存性。分页:REST的原则之一是连接性-通过超媒体链接。同时,没有它们,该服务仍然有用。当在响应中返回链接时,API变得更加自描述。对于支持分页的响应中返回的集合,“first”、“last”、“next”和“prev”链接至少是有益的。资源命名:正确命名资源后,API将直观且易于使用。如果做得不好,相同的API可能会显得笨拙且难以使用和理解。RESTfulAPI适用于消费者。URI的名称和结构应该向这些消费者传达含义。通常很难知道数据边界应该是什么,但是通过了解您的数据,您可能能够进行试验并将有意义的内容作为代表返回给您的客户。为您的客户而不是您的数据设计。-复数:通常接受的做法是始终在节点名称中使用复数,以使您的APIURI在所有HTTP方法中保持一致。原因是“客户”是服务套件中的一个集合,而ID(例如33245)指的是集合中的其中一位客户。监控:确保添加各种监控以提高API的质量或性能。数据点可以是响应时间(P50、p90、P99)、状态代码(5XX、4XX等)、网络带宽等。安全性:-授权/认证:对服务的授权与对任何应用程序的授权没有区别。问这个问题,“这个主体是否拥有给定资源的请求权限?”-CORS:在服务器上实现CORS就像在响应中发送额外的HTTP标头一样简单,例如Access-Control-Allow-Origin、Access-Control-Allow-Credentials等。-TLS:所有身份验证都应使用SSL。OAuth2需要授权服务器和访问令牌凭据才能使用TLS。-幂等性:如果执行一次或多次,将产生相同结果的操作。根据其应用的上下文,它可以具有不同的含义。例如,在方法或子程序调用有副作用的情况下,这意味着修改后的状态在第一次调用后保持不变。-输入验证:验证服务器上的所有输入。接受“已知”的正确输入并拒绝错误输入,防止SQL和NoSQL注入,将消息大小限制为字段的确切长度,服务应仅显示一般错误消息,等等。-限速:是一种限制网络流量的策略。它限制了某人在特定时间范围内重复执行某项操作(例如,尝试登录帐户)的频率。-记录:确保您不会意外记录任何个人身份信息(PII)。至此,我结束了这项研究,我希望你今天学到了一些新东西。本文转载自微信公众号“超级建筑师”,可通过以下二维码关注。转载请联系超级架构师公众号。