API设计:从基础到优秀实践

在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。
作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解。
API设计:电子商务示例
让我们考虑一个类似Shopify这样的电子商务平台的API。如果你不熟悉Shopify,它是一个著名的电子商务平台,允许企业建立在线商店。
在API设计中,我们关注定义API的输入(比如新产品的产品详情)和输出(比如当某人查询产品时返回的信息)。

这意味着我们关注的是接口而不是低级实现。
API设计和CRUD:
因此,焦点主要是定义CRUD操作如何向使用您的电子商务API的用户或系统公开。
CRUD代表Create、Read、Update、Delete。这些是任何数据驱动应用程序的基本操作。

例如,要添加新产品(创建),您将通过POST请求发送到/api/products,其中产品详情包含在请求体中。
- 要检索产品(读取),您需要使用GET请求从/products获取数据。
- 要更新产品信息(更新),我们使用PUT或PATCH请求到/products/:id,其中id是需要更新的产品的id。
- 删除类似于更新;我们通过DELETE请求到/products/:id,其中id是需要移除的产品。
另一部分是决定要使用的通信协议,比如HTTP、WebSockets等,以及数据传输机制:JSON、XML或Protocol Buffers。
这适用于RESTful API,但我们还有GraphQL或gRPC范例。
API范例
API有不同的范例,每个范例都有其自己的一套协议和标准。
1.REST(表述性状态转移)
- 优势: 无状态:客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息。使用标准的HTTP方法(GET、POST、PUT、DELETE)。易于被不同客户端(浏览器、移动应用)消费。
- 缺点: 这可能导致数据的过多或过少获取-因为可能需要更多的端点来访问特定的数据。
- 特性: 支持分页、过滤(**limit**、**offset**)和排序。使用JSON进行数据交换。
2.GraphQL
- 优势: 允许客户端请求确切需要的内容,避免过多或过少获取。基于强类型模式的查询。
- 缺点: 复杂的查询可能会影响服务器性能。所有请求都以POST请求发送。
- 特性: 通常以HTTP 200状态码回应,即使在错误的情况下也是如此,并在响应体中提供错误详细信息。
3.gRPC(Google远程过程调用)
- 优势: 构建在HTTP/2之上,提供了高级功能,如多路复用和服务器推送。使用Protocol Buffers,一种语言中立、平台中立、可扩展的序列化结构化数据的方式。在带宽和资源方面效率高,特别适用于微服务。
- 缺点: 与JSON相比,可读性较差。需要支持HTTP/2。
- 特性: 支持数据流和双向通信。适用于服务器间通信。
API设计中的关系
在电子商务环境中,您可能会有诸如用户到订单、订单到产品等的关系。

设计端点以反映这些关系是重要的。例如,在这种情况下,**GET /users/{userId}/orders**应该为特定用户获取订单。
1.GET请求的查询、限制和幂等性
常见的查询还包括用于分页的**limit**和**offset**,或者用于在某个日期范围内过滤产品的**startDate**和**endDate**。这允许用户检索特定集合的数据,而不会一次性向系统或用户提供太多信息。

设计良好的GET请求是幂等的,这意味着多次调用它不会改变结果。
GET请求永远不应该改变数据。它们只用于检索。
2.向后兼容性和版本控制
在修改端点时,保持向后兼容性非常重要。这意味着确保更改不会破坏现有客户端。
版本控制: 引入版本(比如**/v2/products**)是处理重大更改的常见做法。

在GraphQL的情况下,添加新字段(v2字段)而不删除旧字段有助于在不破坏现有客户端的情况下发展API。
3.速率限制和CORS
另一个最佳实践是设置速率限制。这用于控制用户在一定时间内可以发起的请求次数。这对于维护API的可靠性和可用性至关重要。它还防止API受到DDoS攻击。

通常做法还包括设置CORS设置(跨域资源共享)。CORS设置对于Web安全至关重要。它们控制哪些域可以访问您的API,防止不希望的跨站点交互。
相关文章:
API设计:从基础到优秀实践
在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。 作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解。 API设计:电子商…...
路由的安装顺序
安装前端路由的顺序通常如下: 安装前端框架:选择并安装适合你的项目的前端框架,如React、Vue或Angular等。 创建路由配置文件:在项目根目录下创建一个路由配置文件,比如router.js或routes.js等,用于定义路…...
华为OD机试真题-围棋的气--Java-OD统一考试(C卷)
题目描述: 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知: …...
CANFD数据记录仪在新能源汽车复杂路测下的应用
CANFD数据记录仪在新能源汽车复杂路测下的应用 汽车制造商在生产预批量阶段的耐久性测试中,为了检测潜在故障,必须让车辆在严酷的路况和环境下接受测试。为确保能回溯故障发生的现场情况,我们需要对测试数据精准记录与储存。这些数据是新车型优化迭代的关键,也是确保产品质量的…...
java: 5-6 break
文章目录 1. break1.1 介绍1.2 语法和流程图1.3 入门练习1.4 细节说明1.5 练习 【老韩视频p137-】 1. break 看个需求:随机生成 1-100 的一个数,直到生成了 97 这个数,看看你一共用了几次? 【思路分析:循环,但是循环的次数不知道…...
如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问
文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…...
响应式编程Reactor API大全(上)
Reactor 是一个基于响应式编程的库,主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API,包括创建、转换、过滤、组合等操作符,用于处理异步数据流。以下是一些 Reactor 的主要 API 示例: pom依赖 <dependencyMan…...
vue3自定义指令
一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 页面内创建自定义指令 下面是一个自定义指令的例子,当一个 input 元素被 Vue 插入到 DOM 中后,它会被自动聚焦: <script setu…...
ECharts 多季度连续显示到一个图中。
效果图 二.相关option 以下option可以复制到 echarts的编辑器 进行查看修改 const site test1; const site2 test2;const qtrlyOption function (data: any, titleText: string): any {//获取最大值 。最大最小值的目的是:使左右里边的所有bar使用同一个指标let …...
【Microsoft Copilot】手机端发布 ——GPT-4, DALL-E3 免费用
Microsoft Copilot 关于Microsoft CopilotMicrosoft Copilot 的特点1. 可以在手机端使用:2. 可以免费使用GPT-4。3. 可以无限制地使用GPT-4。4. 可以使用DALL-E3生成图片。5. 搜索功能6. 图像识别 Microsoft Copilot的缺点和注意事项1. 非常容易报错2. 不支持长篇聊…...
[蓝桥杯 2013 省 AB] 错误票据
题目背景 某涉密单位下发了某种票据,并要在年终全部收回。 题目描述 每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造…...
IDEA GitHub令牌原理(Personal Access Token)
1.IDEA的add github account 是什么原理? 在IntelliJ IDEA中添加GitHub账户,主要是为了让IDEA能够与GitHub进行交互,如克隆GitHub上的仓库,提交代码到GitHub等。其基本原理如下: 用户在IDEA中输入GitHub的用户名和密…...
[开发语言][python][c++]:C++中的this指针和Python中的Self -- 26岁生日
C中的this指针和Python中的Self 1. python中的Self2. C中的this指针3. C中的this指针和Python中self的异同点: 以朋友的新岁祝福开篇,祝笔者也祝大家☺️: 一岁一礼 一寸欢喜且喜且乐 且以永日 From VardoZ癸卯年十一月廿六(兔年)之…...
Android Traceview 定位卡顿问题
Traceview 是一个 Android 性能分析工具,用于时间性能分析,主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。Traceview 可以通过图形化界面查看应用程序的代码执行细节,包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈…...
第三方 Cookie 被禁用?企业该如何实现用户精准运营和管理?
从 1 月 4 日开始,谷歌 Chrome 浏览器将逐步禁用第三方 Cookie 。作为全球最大的浏览器之一,Chrome 的这一动作无疑将引发行业内的重大变革。一直以来,第三方 Cookie 都是网络营销和广告的重要工具。然而,随着人们对隐私保护的日益…...
Autosar PNC网络管理配置(2)-基于ETAS软件
文章目录 BswM初始化PNC对PDU的控制BswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMRuleBswMActionListEcuMEcuMWakeupSourceEcuMShutdownCauseEcuMRbAlSwitchOffCalloutEcuMRbOnGoOff...
【SpringMVC快速使用】1.@RestController @RequestMapping 2.logback的使用
背景:为何从这个最简单的 例子写起呢? 那是因为我们的管理后台之类的都是别人写的,我也听说了大家说:只用Post请求就足够了,但是却发现,在浏览器中测试时,默认是GET请求,如果直接写…...
C2593 operator << 不明确
错误 C2593 “operator <<” 不明确,通常出现在C代码中,当你尝试使用<<运算符(通常用于输出或位移运算)时,编译器无法确定使用哪个重载版本的运算符。这个错误可能由几个原因引起: 多个重载冲突…...
vue:使用【3.0】:条件模块
一、条件层级效果图 二、代码 <template><ContentWrap><!-- 添加条件分支:level1 --><div class"btnBox" v-if"isEdit"><el-button type"primary" click"add">添加条件分支</el-button></div…...
Kafka与RabbitMQ的区别
消息队列介绍 消息队列(Message Queue)是一种在分布式系统中进行异步通信的机制。它允许一个或多个生产者在发送消息时暂时将消息存储在队列中,然后由一个或多个消费者按顺序读取并处理这些消息。 消息队列具有以下特点: 异步通…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
