API设计:从基础到最佳实践

news2025/1/24 17:47:24
bbd35ffca80c4b3af56bf408e02c7fd6.png
1*vWvkkgG6uvgmJT8GkId98A.png

在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。

作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解。

API设计:电子商务示例

让我们考虑一个类似Shopify这样的电子商务平台的API。如果你不熟悉Shopify,它是一个著名的电子商务平台,允许企业建立在线商店。

在API设计中,我们关注定义API的输入(比如新产品的产品详情)和输出(比如当某人查询产品时返回的信息)。

6e137779b76940c5de7bda07cf4bcf48.png
1*YfXHE565TbNOddUH-dPZfA.png

这意味着我们关注的是接口而不是低级实现。

API设计和CRUD:

因此,焦点主要是定义CRUD操作如何向使用您的电子商务API的用户或系统公开。

CRUD代表Create、Read、Update、Delete。这些是任何数据驱动应用程序的基本操作。

58d00652b141da14a6fdf978ea556112.png
1*KenCKbhOXaS8AklzmdKC0w.png

例如,要添加新产品(创建),您将通过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有不同的范例,每个范例都有其自己的一套协议和标准。

REST(表述性状态转移)

优势: 无状态:客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息。使用标准的HTTP方法(GET、POST、PUT、DELETE)。易于被不同客户端(浏览器、移动应用)消费。

缺点: 这可能导致数据的过多或过少获取-因为可能需要更多的端点来访问特定的数据。

特性: 支持分页、过滤(**limit****offset**)和排序。使用JSON进行数据交换。

GraphQL

优势: 允许客户端请求确切需要的内容,避免过多或过少获取。基于强类型模式的查询。

缺点: 复杂的查询可能会影响服务器性能。所有请求都以POST请求发送。

特性: 通常以HTTP 200状态码回应,即使在错误的情况下也是如此,并在响应体中提供错误详细信息。

gRPC(Google远程过程调用)

优势: 构建在HTTP/2之上,提供了高级功能,如多路复用和服务器推送。使用Protocol Buffers,一种语言中立、平台中立、可扩展的序列化结构化数据的方式。在带宽和资源方面效率高,特别适用于微服务。

缺点: 与JSON相比,可读性较

差。需要支持HTTP/2。

特性: 支持数据流和双向通信。适用于服务器间通信。

API设计中的关系

在电子商务环境中,您可能会有诸如用户到订单订单到产品等的关系。

5c22d32e12059948d7ab4f33d6f2127a.png
1*QTDjfqDZjm6TVLaC1TFxzg.png

设计端点以反映这些关系是重要的。例如,在这种情况下,**GET /users/{userId}/orders**应该为特定用户获取订单。

GET请求的查询、限制和幂等性

常见的查询还包括用于分页的**limit****offset**,或者用于在某个日期范围内过滤产品的**startDate****endDate**。这允许用户检索特定集合的数据,而不会一次性向系统或用户提供太多信息。

4a67610770f52e880b16318e03c890d5.png
1*DH_mhd_OGwbm2vMbCa1nYA.png

设计良好的GET请求是幂等的,这意味着多次调用它不会改变结果。

GET请求永远不应该改变数据。它们只用于检索。

向后兼容性和版本控制:

在修改端点时,保持向后兼容性非常重要。这意味着确保更改不会破坏现有客户端。

版本控制: 引入版本(比如**/v2/products**)是处理重大更改的常见做法。

9cb57e8961db1db1841dd637674d56ba.png
1*52t5RTNxI9Zz8sAu7Tl5xQ.png

在GraphQL的情况下,添加新字段(v2字段)而不删除旧字段有助于在不破坏现有客户端的情况下发展API。

速率限制和CORS

另一个最佳实践是设置速率限制。这用于控制用户在一定时间内可以发起的请求次数。这对于维护API的可靠性和可用性至关重要。它还防止API受到DDoS攻击。

c970cdde0921c6730323294948a385dd.png
1*0ZMTYW79GrOrBo86jxijjw.png

通常做法还包括设置CORS设置(跨域资源共享)。CORS设置对于Web安全至关重要。它们控制哪些域可以访问您的API,防止不希望的跨站点交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础知识点系列——分支语句(六)

java基础知识点系列——分支语句(六) 流程控制 流程控制语句分类 顺序结构分支结构循环结构 顺序结构 顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行。 if语句 if语…

leetcode238:除自身以外数组的乘积

文章目录 1.使用除法(违背题意)2.左右乘积列表3.空间复杂度为O(1)的方法 在leetcode上刷到了这一题,一开始并没有想到好的解题思路,写篇博客再来梳理一下吧。 题目要求: 不使用除法在O(n)时间复杂度内 1.使用除法&am…

SLF4J Spring Boot日志框架

JAVA日志框架 JAVA有好多优秀的日志框架,比如log4j、log4j2、logback、JUL(java.util.logging)、JCL(JAVA Common Logging)等等,logback是后起之秀,是Spring Boot默认日志框架。 今天文章的目…

C++多态(+多态原理超详解哦)

C多态 引言定义及实现多态的条件虚函数与虚函数的重写接口继承与实现继承函数重载,隐藏,重写的区别 抽象类多态的原理虚函数表(虚表)动态绑定与静态绑定 总结 引言 在生活中不乏这样的例子:成人与儿童在买票时会有不同…

Java基础之并发篇(二)

1、前言 本篇主要基于Java基础之并发篇(一)继续梳理java中关于并发相关的基础只是。本篇基于网络整理,和自己编辑。在不断的完善补充哦。 2、synchronized 的原理是什么? synchronized是 Java 内置的关键字,它提供了一种独占的…

vue中组件的传递取值方式总结

vue中组件的传递取值方式总结 目录概述需求: 设计思路实现思路分析1.父子传参2.vue 子组件接收数据进行渲染或处理3.父组件通过v-on监听自定义事件并取得传递的值4.ref引用子组件5.通过provide/inject传值6.attrs和listeners7.通过vuex进行全局状态管理8.Vue mixin9…

快速查询自己哔哩哔哩账号的注册时间

登录自己哔哩哔哩 访问下面地址 https://member.bilibili.com/x2/creative/h5/calendar/event?ts0 打开后,在网页中查找“jointime”,join time,“加入时间”, 如下图,“jointime”冒号后面的一串数字,是…

汽车ECU的虚拟化技术初探(四)--U2A内存管理

目录 1.内存管理概述 2. 内存保护功能 2.1 SPID 2.2 Slave Guard 3.小结 1.内存管理概述 为了讲清楚U2A 在各种运行模式、特权模式下的区别,其实首先应该搞清楚不同模式下可以操作的寄存器有哪些。 但是看到这个寄存器模型就头大。 再加上之前没有研究过G4MH…

网页设计-用户体验

Use Cases (用例) 用例是用户如何在网站上执行任务的书面描述,从用户的角度描述了系统响应请求时的行为。每个用例都是用户实现目标的一系列简单的步骤。简言之,用例是一种用于描述系统如何满足用户需求的方法。 用例的好处 1. 明确需求: Use…

掌握WPF控件:熟练常用属性(二)

WPF布局常用控件(二) Calendar 用于日期选择的控件。它提供了一个可视化的界面,可以通过它来选择特定的日期。 常用属性描述DisplayMode用来设置Calendar的显示模式,有三种可选值:默认Month(月&#xff…

详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:首期文章 📚订阅专栏:微服务技术全家桶 希望文章对你们有所帮助 在此之前,耗时半个月&#x…

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而,通过采用一些有效的策略和方法,我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度,分享一些实用的建议和技巧,帮助读者在…

Echarts图表如何利用formatter自定义tooltip的内容和样式

在展示多数据图表的时候 有的时候需要图例也展示出一些内容来,例如官方这样子:鼠标悬停的时候展示该点数据 但是,官方提供的样式有时不适用所有的开发场景 我的项目需要实现鼠标悬停在某一点的时候,只展示该条线的数据&#xff0…

【python】进阶--->MySQL数据库(三)

一、修改列的类型长度及约束 alter table 表名 modify 列名 类型(长度) [约束];修改列名 : alter table 表名 change 旧列名 新列名 类型(长度) [约束];二、数据查询语言 查询表中所有的数据 : select * from 表名; 查询表中部分列数据 : select 列名1, 列名2 from 表名;1. …

长亭科技-雷池WAF的安装与使用

目录 1、安装雷池 2、登录雷池 3、简单配置 4、防护测试 5、其他补充 1、安装雷池 在Linux系统上执行如下命令 (需要docker环境,提前把docker、docker-compose 装好) bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release…

MySQL8.0安装(Linux - centos)

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 其他…

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访,使用运营商专线或是采用内网穿透方案,彼此之间究竟有何区别呢? 简单来说,MPLS专线和普通宽带类似是运营商提供的网络租…

【GitHub项目推荐--国外大神复刻暗黑2】【转载】

《暗黑破坏神2》,由顶尖游戏公司暴雪研发,2000 年上市,其资料片 2001 年上市,2D 画面。相信这款游戏已经成为很多人的回忆了,不知道当时是不是也和我一样沉迷于收集套装呢? 这款游戏的剧情设计、画面感都令…

js关闭当前窗口报错Scripts may close only the windows that were opened by them

文章目录 一、问题二、原因三、解决四、最后 一、问题 在Chrome浏览器中调用window.close()关闭当前页面时浏览器控制台报出 Scripts may close only the windows that were opened by them. 且无法关闭当前页面。 先上结论:不是通过JS打开的浏览器标签&#xff0c…

HTML--CSS--边框、列表、表格样式

边框样式 属性: border-width 边框宽度 border-style 边框外观 border-color 边框颜色 需要同时设定三个属性 border-width 边框宽度 取值为像素值 border-style 边框样式 none 无样式 dashed 虚线 solid 实线 border-color 边框颜色 如示例: 为div设…