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

news2024/12/24 8:25:05

在这次深入探讨中,我们将深入了解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,防止不希望的跨站点交互。

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

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

相关文章

2024年 最新 iPhone手机 历代机型、屏幕尺寸、纵横比、分辨率 整理

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

css3边框与圆角

css3边框与圆角 前言边框的三要素边框的三要素小属性 四个方向的边框四个方向边框的三要素小属性 去掉边框利用边框制作三角形圆角 border-radius单独设置四个圆角小属性百分比为单位 盒子阴影阴影延展内阴影多阴影 结语 前言 在网页设计中,边框与圆角不仅仅是简单…

强化学习求解TSP(七):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。它是一种无模型的学习方法,通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策,该函数表示在给定状态下采取某个动作所获…

对git中tag, branch的重新理解

1. 问题背景 项目中之前一个tag(v1.0)打错了,想删除它,但我们从此tag v1.0中迁出新建分支Branch_v1.0,在此分支下修复了bug,想重新打一个tag v1.0,原来的tag v1.0可以删除掉吗? 错误的理解&am…

SQL-分组查询

目录 DQL-分组查询 分组查询注意事项: DQL- 排序查询 🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL &…

RT-Thread入门笔记4-跑马灯线程实例

RT-Thread操作系统是基于线程调度的多任务系统。 线程状态切换 调度过程是一种完全抢占式的基于优先级的调度算法。 支持8/32/256优先级,其中0表示最高,7/31/255表示最低。最低优先级7/31/255优先级用于空闲线程。 支持以相同优先级运行的线程。 共享时…

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…

jupyter notebook 配置conda 虚拟环境python

conda创建python环境 conda create -n openvoice python3.9 激活环境 source activate openvoice 在虚拟环境中安装ipykernel pip install ipykernel 添加虚拟环境进到 jupyter notebook python -m ipykernel install --user --name openvoice --display-name openvoice …

修改idea或者pycharm或者android studio的快捷键,快速跳转到行尾

ctrl enter这个快捷键是idea默认配置的,就是将光标所在的行切一刀,并且换到下一行。但是在我的开发习惯里面不怎么使用ctrl enter这个快捷键, 反而开发java或者flutter软件需要快速跳转到行尾添加分号 ; ,但是使用end键脱离了我…

C++进阶(三)多态

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、多态的概念1、概念 二、多态的定义及实现1、多态的构成条件2、虚函数3、虚函数的重写4、C…

groovy XmlParser 递归遍历 xml 文件,修改并保存

使用 groovy.util.XmlParser 解析 xml 文件,对文件进行修改(新增标签),然后保存。 是不是 XmlParser 没有提供方法遍历每个节点,难道要自己写? 什么是递归? 不用说,想必都懂得~ …

ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin

前两天项目代码拉下来,装完依赖启动的时候直接报错: [eslint] Plugin "react" was conflicted between ".eslintrc.js eslint-config-custom eslint-config-alloy/react" and "BaseConfig D:\pan\erp\test\business-servic…

Java21 如何使用switch case

1. Java8 和 Java21 Java8 引入字符串和枚举 Java21 可以返回值, yield关键字, switch 表达式, 模式匹配, null值处理 2. 代码案例 1. Java8 public static void java8() {String day "tuesday";switch (day) {case "monday":System.out.println("w…

vue3+vite+ts+pinia新建项目(略详细版)

1、新建项目 npm create vite@latest 2、安装依赖 yarn add vue-router yarn add -D @types/node vite-plugin-pages sass sass-loader 3、配置别名 //vite.config.ts import { defineConfig } from vite import path from node:path export default defineConfig({ plu…

基于ssm快餐店点餐结算系统的设计与实现+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装快餐店点餐结算系统软件来发挥其高效地信息处理的作用&…

Python-基础语法

标识符 第一个字符必须是字母表中字母或下划线 _ 。标识符的其他的部分由字母、数字和下划线组成。标识符对大小写敏感。在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。 python保留字 保留字即关键字,我们不能把它们用…

php大型酒店管理系统源码(多酒店版)带安装手册

php大型酒店管理系统源码(多酒店版)带安装手册 系统的运行环境要求PHP7.2以上 功能介绍: 房间动态、房间管理、优惠活动、预定信息、商品管理、营业查询、交班管理 会员营销、查看房价、数据统计、客房服务、物品租借、夜审设置、系统设置 酒店设置、计费…

代码随想录day25 回溯算法加强练习

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

金融中介管理系统,助您高效管理金融中介业务!

金融中介管理系统是一种用于有效管理金融中介业务的软件系统。它提供了一系列工具和功能,帮助金融中介机构简化和优化其日常运营和管理流程。 金融中介管理系统通常具有以下特点和功能: 1. 客户管理 系统可以帮助机构记录和管理客户信息、需求和交互历…

PDF修改技巧之:如何简单方便的编辑PDF文件?

在当今精通技术的世界中,PDF 的使用已变得普遍,尤其是在商业和教育方面。如果您在审阅 PDF 文件时遇到语法或其他错误怎么办? 尽管 PDF 文件不像 Word 或在线文档那样容易编辑,但借助高级工具,您一定可以进行编辑。 …