API协议设计的十种技术

news2024/11/25 4:21:46

文章目录

  • 前言
  • 一、REST
  • 二、GraphQL
  • 三、gRPC(google Remote Procedure Calls)
  • 四、Webhooks
  • 五、服务端的事件发送——SSE(Server-sent Events)
  • 六、EDI(Electronic Data Interchange)
  • 七、面向API 的事件驱动设计
  • 八、WebSocket
  • 九、简单对象访问协议(SOAP)
  • 十、Message Queuing Telemetry Transport(MQTT)


前言

在这个数字时代,我们的日常生活中充斥着各种应用程序和系统之间的交互。无论是社交媒体、在线购物还是智能家居设备,它们都需要通过API(应用程序接口)来实现数据的传输和通信。然而,这些看似简单的操作背后隐藏着复杂的协议。

API协议包含了一组规则和标准,用于定义不同系统之间如何进行通信和共享数据。它们充当了不同应用程序之间的桥梁,使它们能够相互理解和交流。API协议的设计和实现需要考虑到安全性、可靠性和效率等因素,以确保数据的准确传输和系统的正常运行。为了深入了解API的世界,这里对10个常见的API协议设计进行了梳理
在这里插入图片描述


一、REST

REST 是现代 web 开发中最流行的 API 开发技术。它为数据传输提供了一种无状态的体系结构。客户端请求包含满足请求所需的所有详细信息,而服务器不保留客户端的状态。
在这里插入图片描述

在RESTful API中,每个资源都可以通过唯一的URL进行标识和访问。客户端可以通过发送HTTP请求来执行各种操作,如获取资源、创建新资源、更新现有资源或删除资源。RESTful API的设计遵循一些基本原则,如资源的表达、客户端-服务器架构、无状态性和缓存等。REST API 支持本地 HTTP 缓存头,并使用 HTTP 方法(POST、 GET、 PUT、 PATCH 和 DELETE)来操作数据。任何人都可以很容易地开始使用 REST,很简单,而且学习曲线平滑。它还具有良好的可读性和可维护性,因为其使用标准的HTTP方法和状态码来表示不同的操作结果。

然而,RESTful API也有一些限制。由于其无状态性,每次请求都需要包含所有必要的信息,这可能会导致数据传输量较大。随着应用程序的扩展,端点的数量急剧增加,更新数据库模式或数据结构也并不容易。此外,对于复杂的业务逻辑,RESTful API可能不够灵活,需要额外的架构和设计来满足需求。
如果没有任何特定的需求,REST 是最好的选择。例如,如果是开发新手,那么使用 REST 是完美的匹配,因为它的学习曲线比较浅。此外,它还有一个很大的生态系统,可以很容易地找到任何问题的解决方案。另外,在处理许多请求和有限的带宽时,最好使用 REST。在这种情况下,可以使用其缓存支持来提高性能。

二、GraphQL

GraphQL 是2015年引入的一种数据查询语言。它允许开发人员精确定位并获取他们需要的确切数据。与 REST 相比,GraphQL 是一种客户端驱动的方法,客户端可以决定需要什么数据、如何获取数据以及格式。它还解决了取得过多和取得不足的问题,因为客户端可以精确定位所需的数据。

对于 API 而言,GraphQL 被视为一种新思路。GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时环境。GraphQL 对 API 中的数据提供了一套易于理解的完整描述,也让 API 更容易地随着时间推移而演进。GitHub 是使用 GraphQL 的最大公司之一。2016年,GitHub 从 REST 转向 GraphQL,极大地促进了 GitHub 的快速增长。关于 GraphQL 的介绍,网上已经有非常多的资料了,这里不再过多描述,具体可以参考 GraphQL.org。
在这里插入图片描述

在 GraphQL 中,类型系统用于描述 GraphQL Server 的能力并用于判断一个查询是否有效。类型系统还描述了查询参数的输入类型,并在 GraphQL Runtime 中检查参数值的有效性。一个 GraphQL 服务是通过定义类型和类型上的字段来创建的,然后给每个类型上的每个字段提供解析函数。例如,在 Github GraphQL Server 中,使用viewer字段来描述当前登录用户的信息,而viewer的类型为User。一旦启动某个 GraphQL Server,它就能接受 GraphQL 查询,并验证和执行该查询。GraphQL Server 首先会检查该查询以确保它只引用了已定义的类型和字段,然后运行指定的解析函数来生成结果。

与使用普通的 REST API 相比,强类型系统是 GraphQL 最吸引人的地方之一。GraphQL类型系统是其根基,所有人必须遵守,这就在大家对API接口描述形成统一认识上发挥着重要作用。在 GraphQL 中,GraphQL Runtime 确定 GraphQL Server 可以提供的能力,而消费端具体要获取哪些数据则完全由消费者说了算。客户端(消费端)可以以更加平等的地位,更加积极地参与到整个的数据交互过程。借助于GraphQL的类型系统,客户端可以更加自由地根据自己的需求来获得自己的所需,而无需受到 Server 端的限制。

GraphQL 不但改变了通信双方的话语权,还使得客户端可以精确地预测服务端的响应。GraphQL的不足之处在于查询可能很复杂,缺乏内置的缓存支持。与 REST 相比,学习 GraphQL 具有一定挑战性,并且默认情况下它不支持文件上传。

即便如此,在确定是否要使用 GraphQL 技术时,仍需要做认真的分析,且不可为了追新而采用 GraphQL。GraphQL 是查询具有多条记录的数据库的极佳选择。您可以使用 GraphQL 消除数据的额外读取,并且只检索特定格式的必要数据以提高应用程序性能。此外,GraphQL 非常适合于需要从多个资源聚合数据的情况。当不完全理解客户端如何使用 API 时,也可以使用 GraphQL。使用 GraphQL,不需要事先定义一个严格的契约。相反,可以根据客户端反馈逐步构建 API。

三、gRPC(google Remote Procedure Calls)

gRPC 是 Google 在2016年引入的开源远程过程调用(RPC)框架,使用 Protocol Buffers(protobuf)作为接口描述语言。它是一个轻量级的解决方案,并使用最少的资源提供最大的性能。
在这里插入图片描述

gRPC 遵循基于契约的通信方法。它要求客户机和服务器在开始通信之前都要有契约。GRPC 使用 Protobuf (一种声明性语言)创建契约,它使用选定的语言为客户机和服务器生成兼容的代码。gRPC 提供了多语言的支持,包括但不限于C++, Java, Python, Go, Node.js等。这使得开发者可以在不同的语言中构建相互兼容的服务和客户端。

gRPC 支持4种通信方式:

简单请求/响应:客户端向服务器发出单个请求,然后,服务器发送单个响应。
客户端流式通信:客户端向服务器发送一系列请求,然后发送消息通知服务器流已结束,最后,服务器发送一个响应。
服务器流式通信:客户端向服务器发出单个请求。然后,服务器向客户端发送一个消息流。
双向流式通信:gRPC 支持双向流,允许客户端和服务器之间同时发送多个消息。这种双向通信机制使得 gRPC 非常适合实时应用和流式数据处理。

gRPC 使用 HTTP/2 作为底层传输协议,带来了更高的性能和效率。HTTP/2 支持多路复用、头部压缩和二进制传输等特性,提高了通信的速度和资源利用率。它以二进制格式序列化数据,支持全双工通信,还能够进行负载平衡。gRPC 拥有丰富的生态系统,包括支持各种语言的库和工具。它还与 Kubernetes、Envoy、Istio等流行的开源项目集成,提供更全面的解决方案。

总体而言,gRPC 是一个强大而高效的 RPC 框架,适用于构建分布式系统、微服务架构和支持实时通信的应用程序。其设计理念注重性能、可扩展性和跨语言支持,使得它在现代应用开发中得到广泛应用。

四、Webhooks

Webhook是一种强大的技术,它可以实现系统之间的即时更新和通知。通过使用HTTP回调机制,Webhook能够确保各个系统之间的数据保持同步。
图片

使用 Webhooks 时,一个应用程序(服务提供者)通常会提供一个注册接口,让另一个应用程序(服务消费者)注册感兴趣的事件。注册成功后,服务提供者将在相关事件发生时向服务消费者提供的回调地址发送 HTTP 请求,以触发相应的动作。

Webhook的工作原理很简单。当某个事件发生时,例如用户提交表单、发布新的文章或更新数据库,服务器会向预先定义的URL发送一个HTTP POST请求。这个URL可以是第三方应用程序的API端点,也可以是自己搭建的服务器。接收到请求后,服务器会执行相应的逻辑,并将结果通过HTTP响应返回给调用方。

通过这种方式,Webhook实现了系统之间的实时通信和数据同步。它消除了轮询和定期请求的需求,减少了网络流量和延迟。同时,Webhook还具有高度的可扩展性和灵活性,可以适应各种不同的应用场景。无论是开发电子商务网站、社交应用还是物联网设备,Webhook都是一个非常有用的工具。

五、服务端的事件发送——SSE(Server-sent Events)

SSE是一种基于HTTP的通信协议,它允许服务器向客户端推送实时更新的数据。与传统的轮询或长轮询不同,SSE通过建立持久的连接来实现数据的双向通信。一旦连接建立,服务器就可以通过该连接将数据推送到客户端,而无需客户端再次发起请求。例如,客户端首先发送一个HTTP GET请求到服务器,以建立持久的连接。然后,服务器会保持该连接打开,并随时将新的数据推送到客户端。客户端可以通过解析服务器发送的事件流来实时显示或处理这些数据。对基于Web的应用而言, 浏览器对SSE的支持如下:
在这里插入图片描述

由于SSE是基于HTTP协议的,因此它可以与各种编程语言和平台兼容。无论是JavaScript、Python还是Java,都可以通过相应的库或框架来使用SSE。此外,SSE还具有良好的可扩展性和性能优势,适用于处理大量的实时数据更新。

使用Server-Sent Events (SSE),可以体验到实时数据更新的便捷性,这种轻量级协议非常适合用于传输动态内容和即时信息。无论是开发实时聊天应用、新闻聚合网站还是监控仪表盘,SSE都是一个非常有用的工具。

六、EDI(Electronic Data Interchange)

Electronic Data Interchange(EDI)是一个用于交换商业文档的标准。它通过规范文档的结构和内容,使得不同系统之间能够更顺畅地交换业务信息, 也就是说,规范了API 通信内容的格式。通过使用𝗘𝗗𝗜标准,企业可以简化业务流程,提高自动化程度,并降低交易成本。

在这里插入图片描述

EDI可以通过API来实现互操作性。EDI将企业间的商业文档转换为标准的数据格式,这些数据格式转换为其他应用程序所需的数据格式。EDI可以将企业间的商业文档与企业内部的数据进行集成,而API可以将不同应用程序之间的数据进行集成,从而实现数据的共享和流通。EDI可以自动处理商业文档,通过API可以自动处理应用程序之间的数据交换和通信,从而实现业务流程的自动化。

对信息安全而言,EDI可以使用加密和数字证书等安全措施,而API可以使用访问控制和身份验证等安全措施,从而保障信息的安全性。同时I可以通过数据分析来实现数据的挖掘和分析。EDI可以将企业间的商业文档进行汇总和分析,并且以API将不同应用程序之间的数据进行汇总和分析,从而实现数据的挖掘和分析。

七、面向API 的事件驱动设计

“Event-Driven Architecture (EDA)” 指的是事件驱动架构,在API的领域中,表示为API而设计的事件驱动架构。

事件驱动架构强调系统中各个组件之间通过事件进行通信和协作。在这种架构中,组件可以是独立的服务、模块、或者整个系统。事件是系统中发生的事情,可能是状态变化、用户动作、外部触发等。当事件发生时,系统中的组件可以发布(或广播)该事件,同时对该事件感兴趣的其他组件可以订阅这些事件并做出响应。
图片

Event-Driven Architecture 将事件驱动的思想应用于API设计和交互。这种架构风格在处理异步、分布式、和实时性要求较高的应用中非常有用。这一架构强调了通过事件的发布和订阅机制实现 API 组件之间的松散耦合。API 组件可以是生产者(发布事件的组件)或消费者(订阅并响应事件的组件)。DA使得 API 的通信变得异步化,允许组件在不直接等待响应的情况下继续执行。这有助于提高系统的性能和可伸缩性。

事件驱动的架构适用于需要实时性响应的场景,例如实时数据更新、通知推送等。通过事件分发机制,系统可以更即时地响应发生的变化。事件驱动的特性有助于微服务之间的通信和协作。一般地,API 网关可以充当事件的分发者,负责将事件发送到相应的订阅者。这有助于集中管理事件的流向和处理。通过使用事件来驱动 API 的交互,系统能够更好地适应动态变化和不同组件之间的异步通信需求。

八、WebSocket

WebSocket 实现了客户端和服务器之间的双向通信,为双方提供了一种实时而高效的交互方式。通过 WebSocket,客户端和服务器之间可以建立持久性的连接,使得双方可以在任何时候都能够发送和接收数据。这种双向通信机制极大地拓展了传统的请求-响应模型,为开发者提供了更灵活、更即时的交互手段。

在这里插入图片描述

WebSocket 协议通过在客户端和服务器之间创建一个持久性连接,允许双方通过单个socket进行实时通信。与传统的 HTTP 请求-响应模型不同,WebSocket 不需要在每次通信时都建立新的连接,从而减少了通信的开销和延迟。这对于实时应用程序、在线游戏、聊天应用等场景非常有益。

在 WebSocket 中,客户端和服务器之间的通信基于事件。一旦连接建立,任何一方都可以异步地发送消息给对方,而对方也能够立即接收并响应。这种实时的双向通信机制极大地提高了应用程序的交互性,使得用户能够在无感知延迟的情况下享受到更加流畅的应用体验。

总体而言,WebSocket 的引入使得 Web 应用程序在处理实时数据、推送通知和建立互动性方面取得了显著的进步。通过 WebSocket,客户端和服务器之间的双向通信成为现代 Web 应用中不可或缺的一部分,为开发者提供了更多创造性和实时性的可能性。

九、简单对象访问协议(SOAP)

SOAP 是 Web 服务的通信协议, 定义了 Web service 消息的格式。SOAP 编码用于告知 SOAP 运行时环境如何从 Java 等数据结构转化为 SOAP XML。
在这里插入图片描述

XML的可读性和可扩展性使得SOAP能够灵活地适应不同的应用场景,常见的 Web 服务规范包括:

Web 服务安全性(WS 安全性):通过叫做"令牌"的唯一标识符,实现消息安全防护和传输方式的标准化。
WS-Reliable Messaging:标准化了在不可靠的 IT 基础架构间传输消息的错误处理方式。
Web 服务寻址(WS 寻址):将路由信息打包为 SOAP 标头中的元数据,而不是在网络深处维护此类信息。
Web 服务描述语言(WSDL):描述 Web 服务的功能以及该服务的工作起点和终点。

SOAP 是协议独立的,可以在各种网络协议上运行,如HTTP、SMTP等。最常见的是在HTTP上使用SOAP,将SOAP消息封装在HTTP协议中进行传输。SOAP 和 WSDL 指示 Web 服务及其客户端之间的通信。SOAP支持多种消息交互模式,包括单向消息、请求-响应模式和异步消息。这使得它适用于不同的应用场景,从简单的数据查询到复杂的业务流程。
SOAP消息的传输可以使用安全协议,如HTTPS,以确保在网络上传输时的机密性和完整性。此外,SOAP还可以与其他安全标准(如WS-Security)结合使用,提供更高级的安全性支持。

十、Message Queuing Telemetry Transport(MQTT)

MQTT 是一种轻量级的、开放的消息队列传输协议,设计用于在低带宽、高延迟或不稳定网络环境中进行设备间通信。其设计注重资源效率,使其成为在受限环境中运行的设备和应用程序的理想选择。其协议头部较小,通信开销较小,适用于嵌入式系统和移动设备。在这里插入图片描述

“ MQTT”中的“ MQ”是从 IBM 的 MQ (当时称为 MQSeries)产品线派生出来的,其中 MQ 代表“消息队列”。然而,尽管名称如此,该协议并不使用消息队列; 相反,它提供发布-订阅消息: 设备在特定主题上发布消息,所有订阅该主题的设备都接收该消息。它的主要应用包括向控制输出发送消息,以及从传感器节点读取和发布数据。

MQTT 提供不同的服务质量(Quality of Service,QoS)级别,以满足不同应用场景的需求。QoS级别包括至多一次(At most once)、至少一次(At least once)和只有一次(Exactly once)。
MQTT 支持持久性会话。客户端可以选择创建持久性会话,使得在客户端断开连接后,服务器能够保留其订阅信息。这有助于确保客户端在重新连接时能够接收到之前错过的消息。
MQTT 支持基本的身份验证和传输层安全性,但通常需要与其他安全机制结合使用,例如TLS/SSL。

总之,MQTT 是一种灵活、轻量级且易于实现的可靠而高效协议,特别适用于需要实时、可靠通信的物联网和嵌入式系统。


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

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

相关文章

【.NET Core】深入理解异步编程模型(APM)

【.NET Core】深入理解异步编程模型(APM) 文章目录 【.NET Core】深入理解异步编程模型(APM)一、APM概述二、IAsyncResult接口2.1 BeginInvoke2.2 EndInvoke2.3 IAsyncResult属性2.4 IAsyncResult异步演示 三、通过结束异步操作来…

【Linux】yum本地配置

配置将来是在干什么? yum会根据/etc/yum.repos.d/该路径下面的配置文件,来构成自己的下载路径,(根据OS版本,根据你要下载的软件),yum帮助我们下载,安装 一般的机器,内置…

Operation

contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3…

【QML COOK】- 011-动画插值设置

QML中内置了一些动画插值类型。不同的插值类型可以通过Animation的easing属性设置。具体可见:PropertyAnimation QML Type | Qt Quick 6.6.1 1. 创建工程在Main.qml,中编写如下代码 import QtQuickWindow {width: 1000height: 100visible: truetitle: …

数字人直播系统跟无人直播系统的区别是什么?如何选择呢?

有媒体预测,未来几年,数字人工智能将呈现爆发式的增长,数字人系统将广泛应用于各个行业,比如数字人直播,数字人短视频播报,数字人制作的海报宣传等等,当然,这其中应用最广的当属数字…

Python实现离散选择Logit模型(Logit算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Logit模型(Logit model,也译作“评定模型”,“分类评定模型”&…

从想象到现实:Midjourney的AI图像生成之旅

从想象到现实:Midjourney的AI图像生成之旅 继ChatGPT之后,Midjourney作为AI艺术的璀璨明珠,吸引了全球范围内的广泛关注。这款工具通过先进的AI技术,将用户输入的文字描述转化为精美绝伦的图像。无论是风景画、肖像画还是抽象艺术…

CentOS7的安装配置

一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机, 这个没什么好说的,基本上都是下一下一步安装。 注意它的存放位置最好不要放在C盘, 以及开始创建时选择”稍后安装操作系统“ 创建完成后再配置镜像文件 开启虚拟机,继续下…

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…

三、MySQL之创建和管理表

一、基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只 能是一团乱麻,无从下手。 在 MySQL 中, 一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。 …

基于SpringBoot Vue航空机票预订系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

【Linux与windows的文件互相传输】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 关于 rzsz 注意事项 查看软件包 使用命令 下载到本地(使用sz的命令) 本地文件上传到Linux中(使用rz命令) 方法一…

无刷电机学习-方波电调 程序篇1(AM32)

一、AM32简介 AM32 固件专为 ARM 处理器设计,用于控制无刷电机 (BLDC)。该固件旨在安全、快速、平滑、快速启动和线性油门。它适用于多种车辆类型和飞行控制器。 AM32具有以下特点: 可通过 betaflight 直通、单线串行或 arduino 升级固件伺服 PWM、Dsh…

Druid集群搭建手册

1. Java环境安装和配置 建议使用JDK1.8。可以参考《Linux安装JDK完整步骤》。 2. 创建用户 创建druid用户,用来管理druid相关的服务。执行命令: useradd druid #创建用户 passwd druid #设置druid用户密码 3. Zookeeper安装和配置 Druid的服务套…

MySQL---多表分组查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

【手撕C语言 第六集】函数(上)

文章目录 一、函数是什么?二、C语言中函数的分类:1.库函数1.1 如何学会使用库函数? 2. 自定义函数 三、函数的参数1.实际参数(实参):2.形式参数(形参): 四、函数的调用&a…

深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

序列模型(Sequence Model) 基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应…

10分钟入手一套监控系统

写在前面的话 在这里,我将分享一些观测云的小技巧,让您能更好地注册、接入和利用免费额度。 pv每天是2000的免费额度,这里有个技巧,就是支持配置采样率,以1%的采样率来计算,每天也有20万的额度了就是采样设…

【方法】如何把Excel“只读方式”变成可直接编辑?

Excel在“只读方式”下,编辑后是无法直接保存原文件的,那如何可以直接编辑原文件呢?下面来一起看看看吧。 如果Excel设置的是无密码的“只读方式”,那在打开Excel后,会出现对话框,提示“是否以只读方式打开…

CTF CRYPTO 密码学-5

题目名称:山岚 题目描述: 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程: Step1:根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间,看出都是每3个字符的第1…