彻底明白如何设计一个良好的 API

简介: 现在软件开发流程都是协同合作的,前后端分离,那么我们如何实现对 API 的统一认知?又该如何设计一个良好的 API 接口?随着业务的演进,如何设计一个有兼容性的API?面对多种客户端,如何设计一个处处适用的 API 呢?RESTful 是目前最流行的 API 设计规范,通过一定的规范可以解决上面这些问题,对于 RESTful 架构的理解可以参考阮一峰老师的这篇文章(http://www.ruanyifeng.com/blog/2011/09/restful.html),简单一句话就是对服务器端资源进行操作,实现"表现层状态转化"。URI(统一资源定位符)代表一种资源,它可以是一段文本、一张图

背景


现在软件开发流程都是协同合作的,前后端分离,那么我们如何实现对 API 的统一认知?又该如何设计一个良好的 API 接口?随着业务的演进,如何设计一个有兼容性的API?面对多种客户端,如何设计一个处处适用的 API 呢?

RESTful 是目前最流行的 API 设计规范,通过一定的规范可以解决上面这些问题,对于 RESTful 架构的理解可以参考阮一峰老师的这篇文章(http://www.ruanyifeng.com/blog/2011/09/restful.html),简单一句话就是对服务器端资源进行操作,实现"表现层状态转化"。URI(统一资源定位符)代表一种资源,它可以是一段文本、一张图片、一首歌曲、一种服务;每种资源对应一个特定的 URI,存在着这种对应关系。

什么样的 API 是好的设计呢?


我们要遵循以下几个原则:

标准化


RESTful API 通过 GET POST PUT DELETE 等方式对服务器的资源进行操作,因此在定义 API 的时候需要明确定义出:请求方式、版本、资源名称和资源ID,格式如:GET http://{host}/{version}/{resources}/{resource_id},如查看用户编码为1 的用户信息 GET /v1/users/1。

标准化主要从 URL 设计、状态码的使用、服务器响应码使用,具体可参考阮一峰老师的RESTful API 最佳实践(https://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html),千万不要自定义状态码。

兼容性


随着业务的发展,设计一下有兼容性的 API 是非常重要的,如果接口不能够向下兼容,业务就会受到很大影响,产品涵盖 Android iOS PC 等客户端,用户需要产品升级到最新的版本,才能更好地使用,这种情况下引入版本的概念,实现 API 的兼容性。可以参考一些开放 API 的设计,通过版本号或一些开关参数来支持一些新功能。

抽象性


接口抽象都是基于业务需求,定义清晰的业务问题域模型,并建立起和某个问题的对应,实现抽象,可以很好地屏蔽具体的业务实现细节,提供更好的可扩展性。

简单性


遵守最少知识原则,就是客户端,不需要知道那么多服务的 API 接口,以及这些 API 接口的调用细节,如外观接口对各个微服务统一管理(进行业务封装与整合),对调用方提供一个简单的 API ,客户端只需要调用一个接口,而不用关心里面的细节。

高性能


外观接口虽然保证了简单性,但是增加了服务端的业务复杂度,多服务之间的聚合,导致接口性能不好,还要考虑入参字段的各种组合,会不会导致数据库的性能问题,有时候我们暴露了过多字段给外部组合使用,有可能导致数据库没有相应的索引,而发生全表扫描,因此,我们只提供存在索引的字段组合,给外部调用,要求索引字段为必填字段,这样保障能正常使用索引来确保性能

幂等性


幂等性(Idempotent)在这里表示发送一次和多次请求引起的边界效应是一致的。如在网速不够快的情况下,客户端发送一个请求后没有立即得到响应,由于不能确定是否请求是否被成功提交,所以有可能会再次发送另一个相同的请求,幂等性决定了第二个请求是否有效。

HTTP 7种方法中的(GET、HEAD 和 OPTIONS)均是幂等方法。由于 DELETE 和 PATCH 请求操作的是现有的某个资源,所以它们是幂等方法。对于 PUT 请求,只有在对应资源不存在的情况下服务器才会进行添加操作,否则只作修改操作,对于是否幂等操作,还要看这个修改操作是相对的还是绝对的,比如更新年龄,是在原值的基础上加1操作,还是更新成一个新的年龄了。至于最后一种 POST,由于它总是进行添加操作,如果服务器接收到两次相同的 POST 操作,将导致两个相同的资源被创建,所以这是一个非幂等的方法。

怎么解决幂等性问题呢?(简单场景:表单重复提交)利用 Redisson 实现分布式锁,并防止重复提交。这个话题可以单独写一篇文章总结一下。

安全性


对于提供公网域名进行访问,而且接口和关键业务有关,所以安全性很重要。安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,以及如何不被攻击。

  1. 数据加密

数据在传输过程中是很容易被抓包的,如果传输通过 http 协议,那么用户传输的数据可以被任何人获取;所以必须对数据加密,常见的做法对关键字段加密,比如用户密码直接通过 MD5 加密;另外一种主流的做法是使用 https 协议,在 http 和 tcp 之间添加一层加密层(SSL层),这一层负责数据的加密和解密。

  1. 数据加签

数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改,服务端通过验证这个签名来判断是否合法请求。

  1. 时间戳机制

经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据,但是有不法者直接拿到抓取的数据包进行恶意请求;这时候可以使用时间戳机制,在每次请求中加入当前的时间,服务器端会拿到当前时间和消息中的时间验证,看看是否在一个固定的时间范围内,这样恶意请求的数据包是无法更改里面时间的,所以超过这个时间范围就视为非法请求。

  1. AppId 机制

对外提供的接口其实也需要一种机制,并不是谁都可以调用,需要使用接口的用户需要在后台开通 AppId,提供给用户相关的密钥,在调用的接口中需要提供 AppId + 密钥,服务器端会进行相关的验证,获取接口调用凭据 access_token。

  1. 限流机制

本来就是真实的用户,并且开通了 AppId,但是出现频繁调用接口的情况,这种情况需要给相关 AppId 限流处理,常用的限流算法有令牌桶和漏桶算法。

  1. 黑名单机制

如果此 AppId 进行过很多非法操作,经过分析之后直接将此 AppId 列入黑名单,所有请求直接返回错误码。

  1. 数据合法性校验

只有在数据是合法的情况下才会进行数据处理;每个接口都要有验证规则,当然也可能有一些常规性的规则,比如身份证长度和组成,电话号码长度和组成等等。

总结

本文大致列举了几种 API 设计常见的原则:标准化、兼容性、抽象性、简单性、高性能、幂等性、安全性,其中安全措施机制包括:数据加密、数据加签、时间戳机制、AppId 机制、限流机制、黑名单机制以及数据合法性校验。当然肯定有其他方式,欢迎补充。

相关文章
|
缓存 JSON 程序员
良好的 API 设计指南
当用户请求获取一组对象列表时,你就需要对结果进行过滤并返回一组严格符合用户要求的对象。有时返回结果的数量可能非常大,但是你也不能随意对此进行约束,因为这种服务端的随意约束会造成第三方开发人员的困惑。如果用户请求了一个集合,并对返回结果进行遍历,然后只要前100个对象
|
28天前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
|
13天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
22天前
|
SQL 存储 数据处理
|
25天前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
27天前
|
监控 API 数据安全/隐私保护
​邮件API触发式接口分析?邮件API接口好评榜
邮件API在企业通信和营销中至关重要,通过自动化邮件发送流程提升效率与客户满意度。本文解析邮件API触发式接口,即基于特定事件(如用户注册、购买产品)自动发送邮件的技术,能显著加快企业响应速度并增强用户体验。推荐市场上的优秀邮件API产品,包括SendGrid、Mailgun、Amazon SES、Postmark及新兴的AOKSend,它们各具特色,如高发送率、详细分析工具、灵活配置、强大的日志功能及用户友好的API接口,帮助企业根据不同需求选择最合适的邮件API解决方案。
|
1月前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
54 8
|
8天前
|
测试技术 API 数据库
电商API接口定制与开发系列之——商品详情接口介绍
——在成长的路上,我们都是同行者。这篇关于API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 在电商API接口定制与开发系列中,商品详情接口是至关重要的一部分,它直接关系到用户浏览商品、获取商品信息的关键环节。以下是对商品详情接口的详细介绍:
|
13天前
|
存储 数据采集 API
提升店铺好评秘籍:淘宝商品评论接口与电商 API 接口的深度解析
该接口名为item_review,用于获取淘宝商品评论信息,支持HTTP GET或POST请求,体验API为c0b.cc/R4rbK2。主要请求参数包括商品ID(num_iid)、排序方式(sort)、页码(page)。响应参数涵盖评论内容(rate_content)、评论日期(rate_date)、评论图片(pics)、买家昵称(display_user_nick)、商品属性(auction_sku)
|
18天前
|
API 开发工具 数据安全/隐私保护
【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID
【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID