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有不同的范例,每个范例都有其自己的一套协议和标准。
REST(表述性状态转移)
优势: 无状态:客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息。使用标准的HTTP方法(GET、POST、PUT、DELETE)。易于被不同客户端(浏览器、移动应用)消费。
缺点: 这可能导致数据的过多或过少获取-因为可能需要更多的端点来访问特定的数据。
特性: 支持分页、过滤(**limit**、**offset**)和排序。使用JSON进行数据交换。
GraphQL
优势: 允许客户端请求确切需要的内容,避免过多或过少获取。基于强类型模式的查询。
缺点: 复杂的查询可能会影响服务器性能。所有请求都以POST请求发送。
特性: 通常以HTTP 200状态码回应,即使在错误的情况下也是如此,并在响应体中提供错误详细信息。
gRPC(Google远程过程调用)
优势: 构建在HTTP/2之上,提供了高级功能,如多路复用和服务器推送。使用Protocol Buffers,一种语言中立、平台中立、可扩展的序列化结构化数据的方式。在带宽和资源方面效率高,特别适用于微服务。
缺点: 与JSON相比,可读性较
差。需要支持HTTP/2。
特性: 支持数据流和双向通信。适用于服务器间通信。
API设计中的关系
在电子商务环境中,您可能会有诸如用户到订单、订单到产品等的关系。
设计端点以反映这些关系是重要的。例如,在这种情况下,**GET /users/{userId}/orders**应该为特定用户获取订单。
GET请求的查询、限制和幂等性
常见的查询还包括用于分页的**limit**和**offset**,或者用于在某个日期范围内过滤产品的**startDate**和**endDate**。这允许用户检索特定集合的数据,而不会一次性向系统或用户提供太多信息。
设计良好的GET请求是幂等的,这意味着多次调用它不会改变结果。
GET请求永远不应该改变数据。它们只用于检索。
向后兼容性和版本控制:
在修改端点时,保持向后兼容性非常重要。这意味着确保更改不会破坏现有客户端。
版本控制: 引入版本(比如**/v2/products**)是处理重大更改的常见做法。
在GraphQL的情况下,添加新字段(v2字段)而不删除旧字段有助于在不破坏现有客户端的情况下发展API。
速率限制和CORS
另一个最佳实践是设置速率限制。这用于控制用户在一定时间内可以发起的请求次数。这对于维护API的可靠性和可用性至关重要。它还防止API受到DDoS攻击。
通常做法还包括设置CORS设置(跨域资源共享)。CORS设置对于Web安全至关重要。它们控制哪些域可以访问您的API,防止不希望的跨站点交互。
相关文章:
API设计:从基础到最佳实践
1*vWvkkgG6uvgmJT8GkId98A.png 在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。 作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解…...
每日汇评:由于中东危机削弱了风险偏好,欧元将在1.0900附近波动
随着中东危机的加深,欧元兑美元面临大幅抛售; 由于高通胀,欧洲央行决策者推迟了市场对早期降息的预期; 市场将受到周三公布的美国零售销售数据的影响; 持续的中东紧张局势增强了对避险资产的吸引力,而风险感…...
算法每日一题:删除子串后的字符串最小长度 | 栈 | 字符串
大家好,我是星恒 今天给大家带来的是一道另类的栈的应用 话不多说,我们直接来体验 题目:leetcode 2696 给你一个仅由 大写 英文字符组成的字符串 s 。你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 …...
SpringFramework实战指南(一)
SpringFramework实战指南(一) 一、技术体系结构1.1 总体技术体系1.2 框架概念和理解 一、技术体系结构 1.1 总体技术体系 单一架构 一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one。 单一架…...
AtCoder ABC198
本期F为群论题,很有难度。 C - Compass Walking 为了避免精度问题,采用二分推算。但是要小心结果为1的地方。 R 2 ∗ k 2 ≥ x 2 y 2 R^2*k^2\geq x^2y^2 R2∗k2≥x2y2 # -*- coding: utf-8 -*- # time : 2023/6/2 13:30 # file : atcoder.…...
phpinfo和php -m 加载的php.ini不一致
目的: 将phpinfo在web中展示的php.ini和在命令行中展示的php.ini加载路径设置一致。 原本的php.ini加载路劲是: /usr/local/lib/php.ini 解决思路: (1)which php 查看服务器加载的php的位置,这里原来是&a…...
121.买卖股票的最佳时机 122.买卖股票的最佳时机II
121.买卖股票的最佳时机 122.买卖股票的最佳时机II 121.买卖股票的最佳时机 力扣题目链接(opens new window) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…...
Spring Boot整理-Spring Boot是什么?
Spring Boot 是一个开源的 Java 基础框架,它旨在简化基于 Spring 的应用开发。其核心特点在于“约定优于配置”的设计哲学,意味着它提供了一系列默认配置,从而帮助开发者更快地启动和运行新的 Spring 应用。Spring Boot 的主要特点包括: 自动配置:Spring Boot 可以根据项目…...
【pytorch】Pytorch 中的 grid 与 各种变换
Pytorch 中的 grid 与 各种变换 数学原理 **单应性(Homography) : 也就是透视变换。**单应性最初用来研究欧几里得几何中的透视和投影,而单应性一词,从词源学上来说,大致意思是“相似的绘图”。单应性的概念被引入来…...
【Linux】线程池实现
📗线程池实现(单例模式) 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节🔸类成员函数参数列表中隐含的this指针🔸单例模式🔸一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…...
使用Python批量上传本地maven库到nexus
背景:外包类项目开发时是调用的公司maven仓库进行开发,交付后需要将maven仓库转移到客户环境。 原理:1、打开idea运行源代码,将maven包下载到本地仓库, 2、下载包所在目录中执行脚本将本地仓库的maven包上传到客户nex…...
【Unity实战100例】Unity对Ini格式的配置文件管理和读写
目录 一.编写ini格式配置文件 二.读取解析ini文件 三.调用属性 INI 文件以文本形式存储,易于阅读和编辑。这种人可读的格式使得调整配置参数变得更加直观,不需要专门的工具。 INI 文件是一种轻量级的配置文件格式,不需要复杂的解析器或库。它的结构相对简单,适用于小到...
k8s存储卷和数据卷下
静态pv和pvc 运维负责pv:创建号持久化存储卷,申明好读写和挂载类型,以及可以提供的存储空间 Pvc开发做,要和开发沟通好,你期望的读写和挂载类型,以及存储空间 当我发布vc之后可以生成pv,还可以在…...
SQL Server 配置远程连接
Windows 安装好 SQL Server 的 SSMS,打开SSMS配置远程连接 找到 配置管理器 启用 TCP/IP 打开防火墙设置 新建入站规则 端口TCP - 特定本地端口 (1433)允许连接下一步名称完成 重启 SQL Server 服务...
vscode(visual studio code) 免密登陆服务器
1.生成密钥 首先,在本地,打开命令输入框: WinR–>弹出输入框,输入cmd,打开命令框。 然后,在命令框,输入 ssh-keygen -t rsa -C "love"按两次回车键,问你是否重写,选择…...
[redis] redis主从复制,哨兵模式和集群
一、redis的高可用 1.1 redis高可用的概念 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-(宕机时间)/(宕机时…...
debian12部署Gitea服务
首先安装git、wget、sqlite,然后进行用户和组的相关设置 sudo apt install -y git wget sqlite3 新增一个git用户与一个git组 sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos Git Version Control git 给git用户设…...
js动态设置关键侦@keyframes
js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%;to 等价与 100% // 或…...
【WPF.NET开发】流文档
本文内容 什么是流文档?流文档类型创建流内容与流相关的类内容架构自定义文本 流文档旨在优化查看和可读性。 流文档根据运行时变量(例如,窗口大小、设备分辨率和可选的用户首选项)来动态调整和重新排列内容,而不是设…...
golang学习-结构体
1、定义 使用type 和struct 关键字来定义结构体,是值类型 格式如下: type 类型名 struct { 字段名 类型 字段名 类型 ... } 2、实例化 1、var 结构体实例 结构体类型 var p1 Person 2、使用new关键字 var p2 new(Person) 3、使用&对结构体…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
