当前位置: 首页 > 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 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...

ROUGE指标在自然语言处理中的应用:从理论到实践

引言 你是否曾经遇到过机器生成的文本摘要与原文内容不符的情况?或者在使用机器翻译时,发现译文虽然“看起来”正确,但语义却与原文相差甚远?在自然语言处理(NLP)领域,如何科学地评估生成文本的…...

GraalVM:云原生时代的Java虚拟机

1. 概述 GraalVM是由Oracle公司开发的一款高性能、多语言的虚拟机平台。它不仅兼容传统的JVM字节码执行,还引入了即时编译(JIT)技术的革新,以及对多种编程语言的支持。GraalVM旨在通过提供更高效的执行环境来满足云计算环境中日益…...

Linux 信号集与信号掩码

目录 一、引言 二、信号集是什么 三、信号集关键函数 1.信号集的创建与初始化 2.信号的添加与删除 3.信号集的阻塞与解除阻塞 四、信号集实际应用场景 五、信号掩码的作用 六、信号掩码相关函数 1.sigprocmask 函数 2.sigemptyset 和 sigfillset 函数 七、信号掩码注…...

如何设置Edge浏览器访问软件

使用Edge浏览器访问分销ERP A\V系列软件时会出现各种报错,如何设置Edge浏览器使其正常访问,请看下面的具体操作。 一、打开Edge浏览器,点击右上角的 设置及其他,如图: 二、在弹出界面中,点击 扩展&#xff…...

DL笔记:旋转编码RoPE

1 背景 由于计算资源限制,目前的LLM大多在较短的上下文长度中进行训练,在推理中,如果超出预训练的长度,模型的性能将会显著降低 ——>需要一个可提供外推性的位置编码最经典的绝对位置编码就是原始Transformer中的那个sinusoi…...

C语言自定义类型与文件操作

构造类型 枚举类型 若定义不相关的常量使用宏定义;若定义一组相关的常量使用枚举。switch中case后访问的就是枚举。 定义: 我们一般情况下定义常量使用宏定义(#define),宏定义适合没有关联关系的常量;但有时需要对一组有关联关系…...

《计算机网络A》单选题-复习题库解析-3

目录 106、MAN通常是指( ) 107、下列因素中,不会影响信道数据传输速率的是( ) 108、以太网交换机进行转发决策时使用的PDU地址是( ) 109、下列机制中,可以解决因数据帧丢失而…...

VM虚拟机配置ubuntu网络

目录 桥接模式 NAT模式 桥接模式 特点:ubuntu的IP地址与主机IP的ip地址不同 第一部分:VM虚拟机给ubuntu的网络适配器,调为桥接模式 第二部分:保证所桥接的网络可以上网 第三部分:ubuntu使用DHCP(默认&…...

【每日学点鸿蒙知识】Web高度适配、变量声明规范、动画取消、签名文件、包体积优化相关

1、HarmonyOS Web页面高度适配? 在Web页面设置高度100%时,发现和Web控件的高度不一致,这个需要设置什么可以达到页面高度和Web容器高度一致 目前只支持两种web布局模式,分别为Web布局跟随系统WebLayoutMode.NONE和Web基于页面大…...

uniapp使用ucharts组件

1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…...

LabVIEW工程师的未来发展

对于LabVIEW工程师以及更广义的编程从业者(包括“高级民工”码农)来说,随着AI技术和软件编程的逐步成熟,确实面临一些新的挑战和机遇。以下是对此问题的深入分析和未来方向的建议: 现状分析:技术过剩与竞争…...

java的bio、nio、aio 以及操作系统的select、poll、epoll

在 Java 和其他编程语言中,I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO(Blocking I/O)、NIO(Non-blocking I/O)、AIO(Asynchronous I/O),以及操作系统级别的…...

2024 年发布的 Android AI 手机都有什么功能?

大家好,我是拭心。 2024 年是 AI 快速发展的一年,这一年 AI 再获诺贝尔奖,微软/苹果/谷歌等巨头纷纷拥抱 AI,多款强大的 AI 手机进入我们的生活。 今年全球 16% 的智能手机出货量为 AI 手机,到 2028 年,这…...

RLHF,LM模型

LLM(Large Language Model) RLHF(Reinforcement Learning from Human Feedback),即以强化学习方式依据人类反馈优化语言模型。 RLHF思想:使用强化学习的方式直接优化带有人类反馈的语言模型。RLHF使得在一般文本数据语料库上训练的语言模型能与复杂的人类价值观对齐。 R…...

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...

REST与RPC的对比:从性能到扩展性的全面分析

在微服务架构中,服务间通信是核心问题之一。常见的两种通信方式是REST(Representational State Transfer)和RPC(Remote Procedure Call)。它们各有优缺点,适用于不同场景。本文将从性能、扩展性、兼容性和开…...

MATLAB中将MAT文件转换为Excel文件

MATLAB中将MAT文件转换为Excel文件 MATLAB提供了多种方法将MAT文件中的数据导出到Excel文件中。下面介绍几种常用的方法: 1. 使用 writetable 函数 优点: 功能强大,可以灵活控制输出格式。用法: data load(your_data.mat); …...

leetcode hot 100 跳跃游戏2

45. 跳跃游戏 II 已解答 中等 相关标签 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j…...

【Cesium】八、Cesium 默认地图不显示,不加载默认Bing地图

文章目录 前言实现方法App.vue 前言 Cesium 默认加载的地图是bing地图&#xff0c;个人认为请求bing地图会收到网络限制&#xff0c;导致地图资源下载很慢&#xff0c;所以设置默认不加载bing地图&#xff08;后续我使用的是天地图&#xff09; 参考文章&#xff1a; cesium …...

【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南

下面详细介绍所提到的两条命令&#xff0c;它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip &#xff08;Python 的包管理工具&#xf…...

MySQL的sql操作有哪些

MySQL 的 SQL 操作可以分为几个主要类别&#xff0c;每个类别包含了一系列的语句&#xff0c;用于执行不同的数据库操作&#xff1a; 数据查询语言&#xff08;DQL&#xff09; SELECT&#xff1a;用于从一个或多个表中检索数据。可以使用 WHERE 子句进行条件筛选&#xff0c…...

ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标

本文介绍在ArcMap软件中&#xff0c;基于矢量面要素集&#xff0c;计算在其中每一个面区域内&#xff0c;遥感影像的像元个数、平均值、总和等统计值&#xff0c;并将统计信息附加到矢量图层的属性表中的方法。 首先&#xff0c;明确一下本文的需求。现在有一个矢量面要素集&am…...

EasyExcel(环境搭建以及常用写入操作)

文章目录 EasyExcel环境搭建1.创建模块 easyexcel-demo2.引入依赖3.启动类创建 EasyExcel写1.最简单的写入1.模板2.方法3.结果 Write01.xlsx 2.指定字段不写入Excel1.模板2.方法3.结果 Write02.xlsx 3.指定字段写入excel1.模板2.方法3.结果 Write03.xlsx 4.按照index顺序写入ex…...

探索Milvus数据库:新手入门指南(tencent云)

开启向量数据库的奇妙之旅 在数据科学和机器学习领域&#xff0c;Milvus是一个专为向量数据设计的开源数据库。它以其高性能和易于使用的特点&#xff0c;成为了处理大规模向量搜索任务的理想选择。如果你是Milvus的新手&#xff0c;这篇文章将带你一步步了解如何开始你的Milv…...

MySQL:一文弄懂时区time_zone

你还在被以下问题困扰吗&#xff1a; MySQL 的安装规范中应该设置什么时区&#xff1f; JAVA 应用读取到的时间和北京时间差了 14 个小时&#xff0c;为什么&#xff1f;怎么解决&#xff1f; 已经运行一段时间的业务&#xff0c;修改 MySQL 的时区会影响已经存储的时间类型数据…...

基于python的天气可视化系统

目 录 1绪论 1.1研究背景 1.2研究意义 1.3当前研究现状 1.4研究内容 第2章 相关基础理论 2.1 爬虫技术基础 2.2 Python 在爬虫中的应用 2.3 爬虫系统的设计要点 第3章 天气网数据可视化系统设计 3.1 系统概述及主要内容 3.1.1 系统架构 3.1.2 工具选择…...

STM32 高级 WIFi案例1:测试AT指令

需求描述 测试AT指令是否能够正常控制ESP32的wifi&#xff0c;比如重启、读取设备信息等。 思路&#xff1a; stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置&#xff1a; 第一步&#xff1a;对ESP32芯片烧录可以读取stm32命令的固件&#xff08;fac…...

SpringCloud微服务架构

文章目录 认识微服务&#xff1a;SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心&#xff08;nacos一部分功能&#xff09; 服务注册到nacosnacos…...

WebSocket封装

提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...