API协议设计的十种技术

文章目录

  • 前言
  • 一、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 是一种灵活、轻量级且易于实现的可靠而高效协议,特别适用于需要实时、可靠通信的物联网和嵌入式系统。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT 开发者必看“清单“就在这里!

随着HarmonyOS NEXT开启开发者预览版Beta招募,开发者可以体验到全面升级的 OS开放新能力、鸿蒙特征新场景、开发工具等。这是一项需要广大开发者一起参与的伟大事业,华为期待携手开发者一路同行,共赴鸿蒙生态的星辰大海。如何借助HarmonyOS N…

数据集笔记:UJIIndoorLoc

1 数据集介绍 UJIIndoorLoc - UCI Machine Learning Repository UJIIndoorLoc是一个多建筑多楼层的室内定位数据库,用于测试依赖于WLAN/WiFi指纹的室内定位系统。 2 数据读取 数据分类训练数据和测试数据 import pandas as pdapd.read_csv(Downloads/ujiindoo…

矩阵和矩阵如何相乘?

矩阵与矩阵相乘遵循特定的数学规则。为了相乘,第一个矩阵的列数必须等于第二个矩阵的行数。矩阵乘法的结果是一个新矩阵,其行数等于第一个矩阵的行数,列数等于第二个矩阵的列数。矩阵乘法不满足交换律,即 AB≠BA。 例子&#xff…

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…

Mybatis 动态SQL条件查询(注释和XML方式都有)

需求 : 根据用户的输入情况进行条件查询 新建了一个 userInfo2Mapper 接口,然后写下如下代码,声明 selectByCondition 这个方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import j…

接口测试介绍以及用例编写

6.1 接口 6.1.1 接口概述 定义: 接口就是API(Application Programming Interface,应用程序接口),是一个软件或服务对外提供的接口,别人只要调用这接口,而内部如何实现,不需要关心。…

Python 算法交易实验67 第一次迭代总结

说明 在这里对第一次迭代(2023.7~ 2024.1)进行一些回顾和总结: 回顾: 1 实现了0~1的变化2 在信息隔绝的条件下,无控制的操作,导致被套 总结: 思路可行,在春暖花开的时候&#x…

3分钟带你了解,软件测试是做什么的

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥(后面配置要用到) 2.编写工具类 此处使用工具类进行基本属性配置,也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 (一).信息安全概述

地图 - 实现有多条定位,显示多条定位,并且使用一个圆形遮罩层将多条定位进行覆盖

首先&#xff0c;需要在你的index.html模板页面头部加载百度地图JavaScript API代码&#xff0c;密钥可去百度地图开放平台官网申请 <script type"text/javascript" src"//api.map.baidu.com/api?typewebgl&v1.0&ak您的密钥"></script&…

消息队列之王——Kafka

Zookeeper 在学习kafka之前&#xff0c;我们需要先学习Zookeeper&#xff0c;那Zookeeper是什么呢&#xff1f;Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观…

VUE---插槽

一、插槽的作用&场景 1、在封装组件的时候&#xff0c;将可变的结构设计为插槽&#xff08;<slot></slot>&#xff09; 2、使用上述组件的时候&#xff0c;可以按需为插槽提供自定义的结构&#xff0c;以达到复用组件且高度自定的效果 二、基本语法 1、组件内…

2024年【广东省安全员B证第四批(项目负责人)】新版试题及广东省安全员B证第四批(项目负责人)作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;新版试题参考答案及广东省安全员B证第四批&#xff08;项目负责人&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及广东省安全员B证第四批&…

在CentOS 7中配置 RAID服务

实验过程 Xnode1克隆虚拟机raid ps&#xff1a; 阿里云盘Xnode1获取 xnode1 https://www.alipan.com/s/HgLXfoeBWG2 提取码: eb70 编辑虚拟机 添加2硬盘 CRT连接&#xff08;root密码&#xff1a;000000&#xff09; 创建raid 0 [rootdemo ~]# lsblk 安装mdadm [rootdemo…

Facebook直播指南:教你如何轻松控评

Facebook直播在促进互动、扩大影响力、实时报道、创造内容和商业机会等方面都可以发挥很好的效果。无论是企业推广产品还是个人博主提升人气&#xff0c;Facebook直播都是一个值得尝试的渠道。 但是在刚开始直播的时候&#xff0c;可能会遇到以下情况&#xff1a;想要通过Face…

Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

【数据结构与算法】之字符串系列-20240122

这里写目录标题 一、383. 赎金信二、387. 字符串中的第一个唯一字符三、389. 找不同四、392. 判断子序列五、409. 最长回文串 一、383. 赎金信 简单 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果…

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…

微信公众号怎么申请超过2个

一般可以申请多少个公众号&#xff1f;目前公众号申请数量的规定是从2018年底开始实施的&#xff0c;至今没有变化。规定如下&#xff1a;1、个人可以申请1个个人主体的公众号&#xff1b;2、企业&#xff08;有限公司&#xff09;可以申请2个公众号&#xff1b;3、个体户可以申…