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,防止不希望的跨站点交互。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-数据映射模式

设计模式专栏 模式介绍模式特点应用场景技术难点代码示例Java实现数据映射模式Python实现数据映射模式 数据映射模式在spring中的应用 模式介绍 数据映射模式是一种将对象和数据存储映射起来的数据访问方式。具体来说,对一个对象的操作会映射为对数据存储的操作。这…

springCould中的Stream-从小白开始【12】

🥚今日鸡汤🥚 见过一些人,他们朝九晚五😭,有时也要加班,却能把生活过得很😎有趣。他们有自己的爱好,不怕独处。他们有自己的坚持,哪怕没人在乎。🤦‍♂️ 开心…

靶机实战(10):OSCP备考之VulnHub Tre 1

靶机官网:Tre: 1[1] 实战思路: 一、主机发现二、端口发现(服务、组件、版本)三、漏洞发现(获取权限) 8082端口/HTTP服务 组件漏洞URL漏洞(目录、文件)80端口/HTTP服务 组件漏洞URL漏…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果:sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接,其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

K8S的dashboard使用账号密码登录

原文网址:K8S的dashboard使用账号密码登录-CSDN博客 简介 本文介绍K8S的dashboard使用账号密码登录的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题,吊打面试官&…

服务器数据传输安全如何保障?保障意义是什么?

数据安全,是指通过采取必要措施确保数据处于有效保护和合法利用的状态,以及具备保障持续安全状态的能力。数据安全应保证数据生产、存储、传输、访问、使用、销毁、公开等全过程的安全,并保证数据处理过程的保密性、完整性、可用性。无论是互…

网络安全B模块(笔记详解)- 隐藏信息探索

隐藏信息探索 1.访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; ​ 通过windows电脑自带的图片编辑工具画图将打乱的二维码分割成四个部分,然后将四个部分通过旋转、移动拼接成正确的二维码 ​ 使用二维码扫描工具CQR.exe扫描该二维码 ​ 获得一串…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺,4*A53架构,Android 9.0操作系统,搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力,专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

菱形以及各种组合图形讲解(*#@¥$)

引言: ***形对于新手了解循环以及嵌套循环帮助是非常大的。(以下的题各题之间有关联) 我们最终目的,就是会编程写菱形;看下面的图片 解题思路:运用拆分法,我们将菱形分为4个部分,看…

时间差异导致数据缺失,如何调整Grafana时间与Prometheus保持同步?

Grafana时间如何调快或调慢? 在k8s环境中,常使用prometheusgrafana做监控组件,prometheus负责采集、存储数据,grafana负责监控数据的可视化。 在实际的使用中,有时会遇到这样的问题,k8s集群中的时间比真实…

Spark on Hive及 Spark SQL的运行机制

Spark on Hive 集成原理 HiveServer2的主要作用: 接收SQL语句,进行语法检查;解析SQL语句;优化;将SQL转变成MapReduce程序,提交到Yarn集群上运行SparkSQL与Hive集成,实际上是替换掉HiveServer2。是SparkSQL…

“三指针法“合并两个有序数组(力扣每日一练)

我的第一想法确实是:先合并数组,再排序,搞完。 哈哈哈,想那么多干嘛,目的达成了就好了。 力扣官方题解是双指针: 还有糕手: Python: def merge(nums1, m, nums2, n):# 两个指针分别…

27 代码星球卡片

效果演示 实现了一个卡片式的网站页面,其中卡片的背景颜色和字体颜色随着鼠标移动而变化,鼠标悬停时会出现一个渐变的背景和文字颜色,卡片上方还有一个按钮,当鼠标点击按钮时会出现一个动态的渐变背景和文字颜色。整个页面的背景颜…

SQL-修改表操作

目录 DDL-表操作-修改 添加字段 (方括号内容可选) 修改字段 修改指定字段的数据类型 修改字段名和字段类型 删除字段 修改表名 删除表 删除指定表,并重新创建该表 总结 🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦…

虹科分享 | 用Redis为LangChain定制AI代理——OpenGPTs

文章速览: OpenGPTs简介Redis在OpenGPTs中的作用在本地使用OpenGPTs在云端使用OpenGPTsRedis与LangChain赋能创新 OpenAI最近推出了OpenAI GPTs——一个构建定制化AI代理的无代码“应用商店”,随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一…

Qt/C++音视频开发63-设置视频旋转角度/支持0-90-180-270度旋转/自定义旋转角度

一、前言 设置旋转角度,相对来说是一个比较小众的需求,如果视频本身带了旋转角度,则解码播放的时候本身就会旋转到对应的角度显示,比如手机上拍摄的视频一般是旋转了90度的,如果该视频文件放到电脑上打开,一些早期的播放器可能播放的时候是躺着的,因为早期播放器设计的…

基于VSG控制的MMC并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 根据传统同步发电机的运行特性设计了MMC-VSG功频控制器和励磁控制器, 实现了MMC-VSG逆变器对高压电网电压和频率的支撑。该模型包含MMC变流器模块,环流抑制模块,…

【算法】增减序列(贪心,差分)

题目 给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。 求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种…

21道Java Spring MVC综合面试题详解含答案(值得珍藏)

1.概述 1.1 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成…

推荐熊猫电竞赏金电竞系统源码

熊猫电竞赏金电竞系统源码,包含APP、H5和搭建视频教程,支持运营级搭建,这套源码是基于ThinkPHPUniaapp框架开发的。 系统是一套完整的电竞平台开发源码,包括赛事管理、用户系统、竞猜系统、支付系统等模块。源码结构清晰&#xff…