当前位置: 首页 > news >正文

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

https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886

在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。

作为开发人员,您可能熟悉其中的许多概念,但我将提供详细的解释以加深您的理解。

img

API 设计:电子商务示例

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

在 API 设计中,我们关心的是定义API 的输入(如新产品的产品详细信息)和输出(如有人查询产品时返回的信息)。

img

这意味着我们专注于接口而不是底层实现

API 设计和 CRUD:

因此,重点主要在于定义如何将 CRUD 操作公开给与电子商务 API 交互的用户或系统。

CRUD代表创建、读取、更新、删除。这些是任何数据驱动应用程序的基本操作。

img

例如,要添加新产品(创建),您需要发出 POST 请求,并/api/products在请求正文中发送产品详细信息。

要检索产品(读取),您需要使用 GET 请求来获取数据/products

对于更新产品信息(Update),我们使用PUT或PATCH请求/products/:id,其中id是我们需要更新的产品的id。

删除与更新类似;我们发出 DELETE 请求,/products/:id其中 id 是我们需要删除(删除)的产品。

通信协议和数据传输机制

另一部分是决定将使用的通信协议,如 HTTP、WebSockets 等,以及数据传输机制:JSON、XML 或协议缓冲区。

RESTful API 就是这种情况,但我们也有 GraphQL 或 gRPC 范例

API 范例

API 有不同的范例,每个范例都有自己的一套协议和标准。

REST(表述性状态转移)

优点: 无状态:客户端向服务器发出的每个请求都必须包含理解和完成请求所需的所有信息。使用标准 HTTP 方法(GET、POST、PUT、DELETE)。不同客户端(浏览器、移动应用)均可轻松使用。

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

功能:支持分页、过滤(limitoffset)和排序。使用 JSON 进行数据交换。

GraphQL

优点: 允许客户端准确请求他们需要的内容,避免过度获取和获取不足。强类型基于架构的查询。

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

功能:通常以 HTTP 200 状态代码进行响应,即使出现错误,响应正文中也会包含错误详细信息。

gRPC(Google 远程过程调用)

优点: 基于 HTTP/2 构建,提供多路复用和服务器推送等高级功能。使用协议缓冲区,这是一种语言中立、平台中立、可扩展的结构化数据序列化方式。在带宽和资源方面非常高效,特别适合微服务。

缺点:与 JSON 相比,可读性较差。需要 HTTP/2 支持。

功能:支持数据流和双向通信。非常适合服务器到服务器的通信。

API 设计中的关系

在电子商务环境中,您可能存在用户与订单订单与产品等关系。

img

设计端点以反映这些关系很重要。例如,在这个场景中GET /users/{userId}/orders应该获取特定用户的订单。

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

常见查询还包括用于分页的和limit用于筛选特定日期范围内的产品的和。这允许用户检索特定的数据集,而不会让系统或用户一次性承受太多信息。offsetstartDateendDate

img

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

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

向后兼容性和版本控制:

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

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

img

对于 GraphQL 来说,添加新字段(v2 字段)而不删除旧字段有助于改进 API 而不破坏现有客户端。

速率限制和 CORS

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

img

常见的做法是同时设置 CORS 设置 跨源资源共享 (CORS) 设置对于网络安全非常重要。它们控制哪些域可以访问您的 API,从而防止不必要的跨站点交互。

相关文章:

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

https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...

简易内存池(中)

提示&#xff1a;文章 文章目录 前言一、背景二、第二版代码用例2用例3用例4用例5 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 针对上述失败用例&#xff0c;修改代码如下 第二版代码 #include <stdbool.h> #include <stdio.h>…...

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…...

PH47代码框架 24241231 重要更新

仪式感一下&#xff1a;2024年最后一天&#xff0c;发布 PH47 代码框架的一次重要更新。当然这并不是有意的&#xff0c;而是直到现在才把更新的所有工作全部做完&#xff08;希望确实如此&#xff09;。 本次更新要点&#xff1a; 1、加入多IMU支持。本次更新正式加入对 MPU65…...

小程序信息收集(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

用户界面的UML建模07

4.2 抽象表示层的行为&#xff08;Abstract Presentation Behaviour&#xff09; AbstractForm 类定义了一组如下所示的四种操作&#xff1a; showForm() &#xff0c; getData() &#xff0c; sendConfirmation() 和sendCancellation()。在该阶段的设计过程&#xff08;desig…...

LabVIEW手部运动机能实验系统

在运动科学、人机交互和康复训练等领域&#xff0c;手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计&#xff0c;该系统利用力量作为关键参数&#xff0c;通过实时数据采集和反馈帮助受试者完成精确的手部动作&#xff0c;同时为研究人…...

Java Map 源码解析:核心原理与应用

Java Map 源码解析&#xff1a;核心原理与应用 Java 的 Map 接口是集合框架中一个重要的组成部分&#xff0c;专门用于存储键值对。其强大的功能和灵活的实现使其在各种应用场景中得到了广泛的使用。本文面向对 Java 集合框架有一定了解的开发者&#xff0c;通过对 Map 接口及…...

基于Mosquito源码理解MQTT5.0的属性概念

MQTT 5.0协议相比之前的版本(如MQTT 3.1.1)增加了很多属性,这些属性分布于报文的可变头部(Variable Header)和有效载荷(Payload)中。这些属性大大增强了协议的可扩展性和灵活性,使其能够更好地适应现代物联网应用的复杂需求。 属性的定义在源码包mosquitto-2.0.18/inc…...

easyui textbox使用placeholder无效

easyui textbox使用placeholder无效 在easyui 的textbox控件&#xff0c;请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...

java AQS

什么是AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是 Java 中并发控制的一种机制&#xff0c;位于 java.util.concurrent.locks 包下&#xff0c;它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...

机器人对物体重定向操作的发展简述

物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务&#xff08;如装配和打包&#xff09;&#xff0c;对物体放置的位姿由明确的要求&#…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

vue3 Teleport瞬移组件

Teleport是瞬移组件&#xff0c;也称为传送门组件 它是一个可以使元素从一个组件转到另一个组件的组件。 如对话框、自定义菜单、警告提示、徽章&#xff0c;以及许多其他需要出现在特殊位置的自定义UI组件。假设现在页面中有两个元素&#xff0c;分别为div元素和button按钮元…...

Go语言学习路线

以下是一个较为系统的Go语言学习路线&#xff1a; 一、基础阶段 环境搭建与工具链熟悉 安装Go语言开发环境。在Go官方网站&#xff08;https://golang.org/dl/&#xff09;下载适合您操作系统的安装包并完成安装。 配置Go环境变量&#xff0c;如GOPATH和GOROOT。GOROOT是Go语…...

摄像头监视脚本

摄像头监视脚本&#xff0c;若检测到摄像头画面有变化&#xff0c;保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...

【Leecode】Leecode刷题之路第97天之交错字符串

题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; class Solution {public boolean isInte…...

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…...

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...

从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码

从零开发一套UWB定位系统需要多长时间&#xff1f; 从零开发一套UWB定位系统所需的时间会受到多种因素的影响&#xff0c;以下是详细分析&#xff1a; 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统&#xff0c;仅实现基本的定位功能&#xff0c;如在…...

DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级

尊敬的 DataCap 用户&#xff1a; DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化&#xff0c;现将主要更新内容公布如下&#xff1a; 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能&#xff1a;支持创建、删除和切换数据库完善表…...

常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册

文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22&#xff08;SSH&#xff09;2. 端口 25&#xff08;SMTP&a…...

使用maven-mvnd替换maven大大提升编译打包速度

先上结论&#xff01;&#xff01;&#xff01; 多模块清理并打包提升&#xff1a;约3.5倍 多模块不清理打包提升&#xff1a;约5.5倍 单模块提升&#xff1a;约2倍 从计算结果来看&#xff0c;多模块提升的效率更高。在使用mvnd package打包多模块式&#xff0c;可在控制台…...

图像去雾 | 基于Matlab的图像去雾系统(四种方法)

图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 目录 图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 关于图像…...

【Ubuntu 系统 之 开启远程桌面SSH登录】

【Ubuntu 系统 之 开启远程桌面&SSH登录】 一、开启 SSH 登录二、开启远程桌面1、更新包管理器并安装 xrdp1.1、遇到错误1.2、解决方法 2、安装桌面环境&#xff08;如果服务器上没有 GUI&#xff09;3、配置 xrdp 使用默认的 GNOME 桌面环境4、配置防火墙允许远程桌面连接…...

利用 AI 生成 XMind 思维导图教程

本文将介绍如何使用 AI 工具&#xff08;如 ChatGPT 等&#xff09;&#xff0c;从无到有生成层次分明、可直接导入到 XMind 的 Markdown 格式思维导图。主要步骤包括&#xff1a;选择主题、编写并润色 Markdown 文档、在 XMind 中进行导入与可视化。 一、为什么使用 AI XMind…...

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务&#xff0c;特别是在夜间或忙碌时&#xff0c;减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例&#xff0c;满足不同年龄段婴…...

MySQL的索引

没有索引会怎么样 数据库中的数据最终是存储在磁盘上的。 mysql服务器&#xff0c;本质上是内存进程&#xff0c;CURD操作全都是在内存中进行的—索引也是如此。 所以&#xff0c;需要将数据从磁盘读进内存&#xff0c;才能进行操作。 如果没有索引&#xff0c;表中的数据会向…...

Pytest 高级用法:间接参数化

文章目录 1. 引言2. 基础概念2.1 Fixture2.2 参数化 3. 代码实例3.1 基础设置3.2 测试用例示例示例 1&#xff1a;基础的间接参数化示例 2&#xff1a;通过 request 获取参数值示例 3&#xff1a;多参数组合测试示例 4&#xff1a;部分间接参数化 4. 最佳实践5. 总结参考资料 1…...

基于视觉语言模型(VLM)的CogAgent

前言 CogAgent 是由清华大学与智谱AI联合推出的一个多模态大模型&#xff0c;专注于图形用户界面&#xff08;GUI&#xff09;的理解和导航。它代表了在视觉语言模型&#xff08;VLM&#xff09;领域的一项重要进展&#xff0c;特别是在GUI Agent能力方面。相较于传统的基于文…...

文件传输工具FTransferor<优化篇>

在上一篇文章中&#xff0c;我们详细探讨了FTransferor文件传输工具的设计与实现&#xff0c;并展示了它在局域网文件传输方面的高效性。然而&#xff0c;随着互联网应用场景的不断丰富&#xff0c;传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...

【Linux】Centos7下载npm

Index of /dist/v16.20.2/ (nodejs.org) 下载 wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.gz解压 sudo tar -zxvf node-v16.20.2-linux-x64.tar.gz 配置环境变量 sudo vim /etc/profile export NODE_HOME/usr/local/node-v16.20.2-linux-x64 ex…...

Spring boot + Hibernate + MySQL实现用户管理示例

安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…...

Neo4j GDS 2.0 安装与配置

Neo4j GDS 2.0 安装与配置 GDS插件安装&#xff1a;Neo4j官方文档 1. GDS简介 Neo4j Graph Data Science (GDS) 库作为 Neo4j Graph Database 的插件提供。该插件需要安装到数据库中并在 Neo4j 配置中列入白名单。有两种主要方法可以实现这一点&#xff0c;我们将在本章中详…...

【非关系型数据库Redis 】 入门

Redis入门 一、非关系型数据库概述 &#xff08;一&#xff09;概念 非关系型数据库&#xff08;NoSQL&#xff0c;Not Only SQL&#xff09;是相对于传统的关系型数据库而言的一种数据存储管理系统。它摒弃了关系型数据库中严格的表结构、SQL 语言操作以及复杂的事务等特性…...

【Linux报告】实训一:GNME桌面环境的设置及应用

实训一&#xff1a;GNME桌面环境的设置及应用 【练习1】在图形模式和文本模式下登录Linux系统。 1、开启Linux虚拟机。 答&#xff1a;打开此虚拟机如图所示 2、观察屏幕上显示的启动信息。 3、当系统启动到图形界面时&#xff0c;用普通用户身份登录。 答&#xff1a;如图…...

mysql8 从C++源码角度看 客户端发送的sql信息 mysql服务端从网络读取到buff缓存中

MySQL 8 版本中的客户端-服务器通信相关&#xff0c;特别是在接收和解析网络请求的数据包时。以下是对代码各个部分的详细解释&#xff0c;帮助您更好地理解这些代码的作用。 代码概述 这段代码主要负责从网络读取数据包&#xff0c;它包含了多个函数来处理网络数据的读取、缓…...

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…...

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay...

HTML5实现好看的喜庆圣诞节网站源码

HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码&#xff0c;圣…...

鸿蒙 NEXT 开发中,使用公共事件进行进程间通信

大家好&#xff0c;我是 V 哥&#xff0c;在鸿蒙 NEXT 开发中&#xff0c;使用公共事件进行进程间通信&#xff08;IPC&#xff09;是一种常见的做法。下面我将提供一个完整的业务代码示例&#xff0c;并解释逻辑关系&#xff0c;以便即使是初学者也能按照步骤进行实操&#xf…...

算法-excel表头位置转成对应数字 26进制转10进制

给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出: 1示例 2: 输入: colu…...

清华发布Hyper-YOLO:超图计算+目标检测!捕捉高阶视觉关联

目录 论文信息 引言 背景 算法概括 超图计算 Hyper-YOLO整体架构 基于超图的跨层次和跨位置表示网络 Coovally AI模型训练与应用平台 实验结论 总结 论文信息 题目&#xff1a;Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation Hyper-YOLO&a…...

如何使用网络工具进行网络性能评估

网络评估是对IT基础设施的系统评估&#xff0c;以确保它能够很好地满足企业的核心运营需求&#xff0c;确定了基础设施中需要改进的领域&#xff0c;并定义了改进的范围。 网络评估工具分析IT基础设施的各个方面&#xff0c;它通过评估网络设备、网络性能和安全威胁来仔细检查…...

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…...

使用three.js 实现vr全景图展示,复制即可用

1.实现效果 2.代码 1.npm安装three.js npm install three 2.引入three.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls 3.初始化模型 init(val) {this.container document.querySelector(.container)// 初始…...

MATLAB关于集合的运算(部分)

集合运算比较两个集合中的元素&#xff0c;以找出共性或差异 i n t e r s e c t intersect intersect表示两组数据的交集 i s m e m b e r ismember ismember表示查找数据的集合成员 u n i o n union union表示两个数据集的并集 u n i q u e unique unique表示查找数据集的…...

谈谈数据产品开发流程

数据产品开发流程涵盖以下关键步骤&#xff1a;首先是需求调研与规划&#xff0c;通过与业务部门等沟通&#xff0c;明确产品定位、受众及功能&#xff0c;制定项目计划。接着进行数据采集与处理&#xff0c;确定数据源&#xff0c;运用合适工具采集并清洗、转换数据后存储。然…...

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分&#xff0c;道具包括你可以拾取的东西&#xff0c;你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本&#xff0c; 新增如…...

Linux(Centos 7.6)常见基础配置

1.网络配置 网络配置详见&#xff1a;VMware安装Linux(Centos 7.6)后网络配置 2.yum源配置 yum源配置详见&#xff1a;Linux(Centos 7.6)yum源配置 3.主机名配置 1.Linux(Centos 7.6)系统安装后&#xff0c;没有配置主机名时&#xff0c;root用户登录后&#xff0c;是如下…...