⚡REST 和 SOAP 协议有什么区别?

原文链接:https://document360.com/blog/rest-vs-soap/

API 是应用程序编程接口(Application Programming Interface)的缩写。API 规定了不同的软件组件应如何以编程方式进行交互和通信。

最常见的 API 类型就是 Web API。网络应用(包括网站)向 Web API 或网络服务发送请求,要求向用户显示数据。举个例子一个网站会根据你的搜索条件,返回航班、酒店或租车的最优惠 信息。网站不会从它的数据库中检索这些数据,而是通过向专门提供航班、酒店等服务的 API 发送请求来获取数据的。Web API 就是使用 HTTP 协议传输数据的 API。

目前最流行的两种网络 API 规范是 REST 和 SOAP。

关于哪种架构风格最适合构建 API,目前还存在争议。它们虽然都是规范,但却不能把它们相提并论,有一个微妙的区别在于,REST 是一种 API 架构风格,而 SOAP 则是一种访问网络服务的协议。它们看似相互竞争,但两者都有各自的使用场景。

本文将探讨这两种标准之间的差异,以及两种协议该如何选择。

REST 和 SOAP 的异同

REST 和 SOAP 之间的共同点是什么,为什么它们经常被拿来比较?

REST 和 SOAP 都是规范,为客户如何访问网络服务、与网络服务交互以及它们所暴露的功能提供了标准。如前文所述,REST 是一种 API 架构风格,而 SOAP 是一种数据传输协议。

  • REST 作为一种架构风格,对 Web API 的设计有一定的限制。REST 标准要求被视为 “RESTful ”的 Web API 必须遵守 REST 约束。这些约束包括客户端与 API 服务器分离、无状态和可缓存性等等。
  • SOAP 作为 Web API 协议,是一种数据传输的标准,它规定了消息的:
    1. 格式
    2. 通信协议
    3. 处理方式。与 SOAP 不同,REST 并不规定如何处理 API 信息

由于 SOAP 只是一种 Web API 协议,因此 REST API 可以使用 SOAP 协议作为数据传输的标准。不过,REST 和 SOAP 是不同的标准,一般不能混用。

虽然一个是架构,一个是协议,但两者都为 API 消息格式提供了标准。REST 和 SOAP 的信息格式可由人类和机器读取。对于 REST 而言,JSON 是一种轻量级数据交换格式,与浏览器高度兼容。对于 SOAP 而言,XML 是一种可扩展的标记语言,允许自定义描述性标记,便于阅读。稍后将详细讨论这些数据格式。

在 REST 之前的 SOAP

SOAP 出现在 REST 之前。REST 的设计旨在解决 SOAP 的一些问题。REST 的目标是轻量级、与浏览器高度兼容、将客户端与服务器分离并提供缓存功能。

那么,如果 REST 出现在 SOAP 之后,并且 REST 解决了 SOAP 的问题,为什么 SOAP 还存在呢?

这是因为虽然 REST 比 SOAP 有明显的优势,而且在某些方面来说,REST 的目的就是要取代 SOAP,但 SOAP 也依然有它的用武之处。例如 SOAP 适合需要消息级安全性的企业级应用。

什么是 REST API?

REST 是“表征性状态传输”(Representational State Transfer)的缩写,是一种特定的 API 构建风格,通过这种风格进行约束的 API 被认为是 RESTful AP I。RESTful API 必须满足以下要求:

  1. 统一的接口
  2. 无状态
  3. 可缓存
  4. 客户端与服务器分离
  5. 分层系统
  6. 按需编码

REST API 是使用 HTTP 协议的 Web API,其中客户端向 API 服务器发送 HTTP 数据请求,然后服务端将带有编码数据的 HTTP 响应回客户端。

客户端使用 “资源 ”访问和操作 REST API 公开的数据。资源代表不同的 API 功能,并通过资源 URL 对其进行访问。可以将资源视为 API 返回的数据对象。在发送请求时,你会向资源传递一个与 CRUD(创建、读取、更新和删除)操作相对应的方法。将方法视为对资源采取的 “操作”,例如创建、更新或删除资源。

例如,众所周知的 Swagger Petstore API 由多个资源组成。这些资源包括宠物、商店和用户。所有资源都与宠物店这一主题有关,每个资源都代表了你可以创建、操作或删除的不同数据对象。

要请求一个资源,你需要向该资源的唯一 URL 发送 HTTP 请求,并指定要对该资源采取的操作(方法)。示例操作包括创建、更新、查询或删除资源(分别为 POST、PUT、GET 和 DEL)。

REST API 的优点

前后端分离

前后端分离具有以下优点:

  • 所有组件的可迁移性。 由于 REST 架构是“多层次的”,所以服务器组件具有可迁移性。REST API 可在多个平台上使用,这可以在开发过程中轻松进行测试。
  • 通过限制架构层之间的交互(多层次架构), 提高了可扩展性。这种限制简化了服务器组件。这种架构还提高了在服务器之间迁移数据的灵活性,并且可以迅速推出新的更改。
  • 更易集成。 REST使开发人员能够更多地关注用户界面、功能和业务规则,而不是由API服务器处理的服务器组件和数据管理。

支持 JSON 消息格式

REST 使用 JSON 作为数据格式有几个优点:

  • 浏览器兼容性:JSON 作为一种数据格式,与浏览器非常兼容,对浏览器更友好。
  • 占用带宽少:JSON 是一种极其轻量级且易于解析的数据格式。XML 有效载荷(就 SOAP 而言)比 JSON 大。较大的有效载荷需要更多带宽。编写 XML SOAP 请求所需的代码量也会增加信息的大小。

信息格式的灵活性

除了 JSON 之外,REST 还提供更多信息格式,如 HTML、纯文本、XML、YAML 等。消息格式的灵活性使 REST 更适用于公共 API。

什么是 SOAP?

XML 允许使用自定义的描述性标签来存储和共享信息,这与 HTML 使用的预定义标签不同。XML 的标准化特性使其能够在不同平台和系统间轻松迁移。作为一种消息格式,XML 提供了很高的灵活性,用户可以根据需求定义 XML 模式,以确保 XML 消息的结构满足特定要求。

在数据访问和操作方式上,SOAP API 与 REST API 有所区别。REST API 通过资源 URL 来访问数据,而 SOAP API 则是通过调用特定的 API 函数来操作数据。

与 REST 不同,SOAP 请求中并不直接包含 CRUD(创建、读取、更新、删除)操作。相反,这些操作是通过调用不同的函数来实现的。例如,在 REST API 中,通常只需一个 URL 端点,通过发送 POST 或 PUT 请求即可完成资源的创建或更新。而在 SOAP 中,创建或更新数据对象需要分别调用处理这些特定操作的独立函数。

XML 消息主要通过 HTTP 或 HTTPS 协议进行传输。但值得注意的是,SOAP API 还支持其他传输协议,如传输控制协议(TCP)、简单邮件传输协议(SMTP)和用户数据报协议(UDP)。相比之下,REST API 则仅限于使用 HTTP 协议。

SOAP 的优势

更强的安全性

SOAP 非常适合注重安全的网络服务,因为它使用 WS-Security(以及 SSL)和内置 ACID 合规性。REST 则不具备这些功能。WS-Security 是关于对 SOAP XML 消息进行签名和加密的规范。每个 SOAP 请求的标题块都包含完成请求所需的安全信息。ACID 合规性是一套保护数据库完整性的标准。许多企业级和金融交易应用程序都需要 ACID 合规性。

灵活的传输渠道

SOAP 支持多种通信协议。REST 仅支持 HTTP。使用 SOAP,你可以使用 HTTP、HTTPS、用户数据协议(UDP)、传输控制协议(TCP)或简单邮件传输协议(SMTP)。

REST 剖析

REST API 由以下部分组成:

  • 请求方法: 希望对资源执行的 CRUD 操作。在本例中,HTTP 方法 POST 表示希望创建某个内容。
  • 端点: 资源的特定端点(资源 URL)。在本例中,端点是 https://petstore.swagger.io/v2/pet。资源是 API 返回的数据对象,可使用端点进行定位。
  • 请求头: 指定信息格式,本例中为 JSON 格式。您可以在请求头中传递授权租户(如 API 密钥)。
  • 请求体: 包含一个 JSON 对象,其中包含新资源的属性。在本例中,请求体包含新宠物的详细信息。请求体与参数类似,只是它们是包含多个属性的对象,而不是一个。

下面是向 Swagger Petstore API 发出的创建宠物的 REST API cURL 请求。
在这里插入图片描述

SOAP 剖析

SOAP XML 消息包含以下几个“块”:

  • Envelope(信封): 必需的部分,用于标识该 XML 消息为 SOAP 消息(与其他XML消息不同)。其namespace属性指向SOAP的最新版本。
  • Header(请求头): 可选的部分,用于存储授权属性,如 API 密钥等。
  • Body(主体): 必需的部分,用于指定在提交请求后期望从 API 接收哪些信息返回。此部分包括函数名(过程)和你希望传递的参数,这些将影响结果。在响应中,Body 部分包含 API 的响应以及所请求的信息。
  • Fault(错误): 可选的部分。如果 SOAP API 无法处理请求,它将发送在此处定义的错误消息。请求失败的原因有很多,例如,消息结构可能不符合 XML 模式定义。

为了理解 SOAP 的结构,让我们比较一下 REST 消息和 SOAP 消息。下面是向 Swagger Petstore API 发出的 REST API cURL 请求,该请求根据 petId 检索宠物。 petId 1 是一个路径参数,放在请求的资源 URL 末尾。

在这里插入图片描述
下面是相同请求的 SOAP 结构,以展示它们的差异:

在这里插入图片描述

以下是它们的不同点:

  • 信息格式:
    • REST - cURL 是用于构建 HTTP 请求的工具,但你也可以使用多种编程语言来发送 REST 请求。这些请求的消息负载(即消息正文)通常采用 JSON 格式。
    • SOAP - 信息格式为 XML。XML 结构由 XML 架构执行。
  • 请求方法(CRUD 操作):
    • REST - 在请求中提供 GET 方法,告诉应用程序接口检索某些内容。
    • SOAP - 请求中不提供方法。请求会被发送到一个处理检索的过程(GetPet 函数)。
  • 参数:
    • REST - 宠物 ID 作为路径参数传递给端点 URL。
    • SOAP - 使用 GetPet 选项在 Body 块中传递宠物 ID。

何时使用 REST 与 SOAP

REST 适用于公开 Web 服务

REST 因其使用 JSON 作为消息格式而非常适合公开 Web 服务和开放 API。JSON 的轻便、小巧以及与浏览器的高度兼容性,都使其相较于 SOAP 的 XML 格式更具优势。此外,SOAP 的 XML 消息较为冗长,而 JSON 则更加简洁。

在处理 SOAP XML 消息时,由于其组成的复杂性,通常需要在编程语言中集成 SOAP 库进行 API 调用,这相对增加了抽象层和处理开销。与此相反,REST 倡导的前后端分离的原则不依赖于客户端库,从而保持了网络服务的可迁移性、可扩展性和独立发展性。

在资源受限的网络服务环境中,REST 的优势还在于客户端可以有效地缓存 HTTP 响应。这是通过 REST 使用 URL 分离端点并利用 HTTP 请求头执行 CRUD 操作实现的,而 SOAP 则因其 POST 请求方式而难以实现缓存。

企业级应用更倾向SOAP

尽管 REST 在公开网络服务中表现出色,但 SOAP 在安全关键型应用中更具优势,这得益于其内置的消息级 WS 安全性。这种附加的安全性,使得 SOAP 更适合用于企业级软件,如客户关系管理、身份认证、银行应用、金融和电信服务,以及与传统系统的集成。

此外,SOAP 还内置了 ACID 合规性,这一点对于敏感的金融服务尤其具有吸引力。因此,在企业级应用中,SOAP 往往因其强大的安全性和事务处理能力而备受青睐。

除了 SOAP 和 REST 之外的其他选择

除了 SOAP 和 REST,还有其他一些常见的选择,如 GRPC 和 GraphQL。

gRPC 这个标准非常适合需要在带宽受限的情况下进行轻量级消息传递的微服务架构。你可以使用 gRPC 将智能手机等物联网设备与后端服务连接起来。

GraphQL 是一种越来越受欢迎的数据库查询语言。从 GraphQL API 请求数据比使用 REST 更高效。使用 REST 时,有单独的资源 URL(有时多达数百个)来暴露 API 的功能。如果你需要从两个资源中收集信息,你必须向每个资源 URL 发出请求。而使用 GraphQL,所有 API 数据都可以通过一次查询请求获取。客户端使用过滤器缩小查询范围,从而从一个 API 中检索数据。

总结

REST 和 SOAP 都是为客户端访问和与 Web 服务交互以及其暴露的功能提供标准的规范。然而,REST 是一种 API 架构风格,而 SOAP 是客户端与 Web 服务器之间的数据传输协议。因此,将两者进行比较并不完全对等。

REST 的出现是为了改善 SOAP 的局限。REST 的优势使其非常适合资源受限的公开 Web 服务。REST 的数据格式 JSON 与浏览器高度兼容,并且比 SOAP 的 XML 有效载荷所需的带宽更少。REST 还强制要求前后端的分离。这一约束对于网络服务的高效运行至关重要。虽然 REST 在某些方面已经取代了 SOAP 在公共网络服务中的地位,但 SOAP 在安全敏感的场景中,如企业级应用和金融服务中,仍然有着很高的采用率。

更多 API 管理及 API 全生命周期相关内容可以在我的 Notion 查看,我将会持续更新:API 全生命周期管理资料

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

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

相关文章

自学错误合集--项目打包报错,运行报错持续更新中

java后端自学错误总结 一.项目打包报错2.项目打包之后运行报错 二.项目运行报错 一.项目打包报错 javac: �Ҳ����ļ�: E:\xx\xx\xx\docer-xx\src\main\java\xx\xx\xx\xx\xx\xx.java �&#xff…

OceanBase 如何实现多层面的资源隔离

OceanBase的资源隔离涵盖了多个方面,如物理机器间的隔离、不同租户之间的隔离、同一租户内的隔离,以及针对大型查询请求的隔离等。在实际应用OceanBase的过程中,我们经常会遇到这些操作场景或产生相关需求。这篇文章针对这些内容进行了简要的…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手 1.让Optional发光发热:去除代码中对null的检查, 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接: https://pan.quark.cn/s/5cf68…

书生·浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版)

书生浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版) 环境配置 conda create -n llama3 python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -y conda activate llama3conda install git git-lfs install✨下载 Llama3…

Figma 高效技巧:设计系统中的图标嵌套

Figma 高效技巧:设计系统中的图标嵌套 在设计中,图标起着不可或缺的作用。一套便捷易用的图标嵌套方法可以有效提高设计效率。 分享一下我在图标嵌套上走过的弯路和经验教训。我的图标嵌套可以分三个阶段: 第一阶段:建立图标库 一…

使用Java编写的简单彩票中奖概率计算器

前言 在当今社会,彩票已经成为许多人追逐梦想和改变生活的一种方式。然而,中奖的概率却是一个让人犹豫和兴奋的话题。在这篇文章中,我们将探讨如何使用Java编程语言实现一个简单的彩票中奖概率计算器。通过这个计算器,我们可以根…

C++细节,可能存在的隐患,面试题03

文章目录 11. C编译过程12. const vs #define12.1. 全局const vs 局部const 13. C内存分区14. C变量作用域14.1. 常量 vs 全局变量 vs 静态变量 15. C类型转换16. 函数指针17. 悬空指针 vs 野指针18. 为什么使用空指针,建议使用nullptr而不是NULL? 11. C…

Linux初识

1.操作系统的那点事 (1)结论:操作系统是作软硬件管理的软件; (2)计算机是操作系统,设备驱动,硬件三个相互结合发挥作用的,操作系统是用来管理硬件的,常见的…

【Linux-I.MX6ULL裸机学习】中断向量表

代码来自于正点原子阿尔法Linux开发板光盘 比如在中断向量表中规定了:在某个地址0x80000A对应着某个中断服务函数,那么在产生这个中断时,就会从0x80000A这个地址去读取中断服务函数,并执行。 如果想改变这个地址,也就是…

【Linux】基础命令

常用命令及参数:dir表示文件夹,file表示文件(file可表示其他目录下的文件) pwd命令;查看当前所属文件夹(print working directory) ls [选项] dir;查看当前、指定文件夹目录内容&am…

《Fundamentals of Power Electronics》——隔离型CUK转换器、

以下是隔离型CUK转换器的相关知识点: Cuk电路的隔离型版本获得方式不同。基础非隔离型Cuk电路如下图所示。 将上图中电容C1分成两个串联的电容C1a和C1b,得到结果如下图所示。 在两个电容之间插入一个变压器,得到如下图所示电路。 变压器极性…

Quora 首席执行官亚当·德安杰洛 (Adam D’Angelo) 谈论了 AI、聊天机器人平台 Poe,以及 OpenAI 为什么不是竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽

进程间为何要通讯 ? 鸿蒙内核默认支持 64个进程和128个任务,由进程池和任务池统一管理.内核设计尽量不去打扰它们,让各自过好各自的日子, 但大家毕竟在一口锅里吃饭, 不可能不与外界联系, 联系就得有渠道&#xff0c…

虚幻引擎笔记

虚幻引擎笔记 一、蓝图类二、创建自定义Character蓝图三、操作映射和轴映射 一、蓝图类 Actor:可以放置在关卡中的物体Pawn:相当于游戏角色,可以通过玩家控制器来控制角色:在Pawn的基础上增加了四处走动的功能。创建游戏角色时使用…

创意无限,批量剪辑技巧:视频剪辑中的画中画技巧大揭秘

在视频剪辑的世界里,创意是无限的,而技巧则是实现这些创意的关键。画中画技巧作为视频剪辑中的一种高级技术,可以带给观众新颖的视觉体验,提升视频的质量和观赏性。本文将深入探讨批量剪辑中的画中画技巧,揭示其背后的…

就业班 第三阶段(redis) 2401--5.7 day2 redis2 哨兵(前提是做好了主从)+redis集群

1、设置密码(redis) 先在redis.conf里面找到这个 后面写上要设置的密码即可 2、哨兵模式 监控redis集群中master状态的的工具 在做了主从的前提下 主 从1 从2 作用 1):Master状态检测 2):如果Master异常,则会进行…

2-5 任务:打印九九表

本次实战的目标是通过编写程序实现打印九九乘法表、字符矩形、字符平行四边形和字符菱形等图形,以及解决百钱买百鸡问题和输出素数等实际问题。在实战过程中,我们将学习并掌握以下知识点。 双重循环的使用:通过双重循环实现九九乘法表的打印&…

告别杂乱桌面,开启纯净视界!DeskCover Pro,Mac用户的桌面神器!

DeskCover Pro for Mac是一款专为macOS设计的桌面图标隐藏软件,其主要功能和特点包括: 桌面图标隐藏:通过单击鼠标或按全局热键,可以快速隐藏桌面上的所有图标,为您提供一个干净整洁的工作环境。窗口聚焦:…

证券基金信创联盟研讨会:YashanDB分享金融核心数据库技术实践

4月26日,由证券基金行业信息技术应用创新联盟主办、WG3稽核风控系统工作组承办、国信证券股份有限公司协办的信创联盟2024年度系列研讨会第三期-稽核风控系统信创实践成功举办。国内头部企业国信证券、申万宏源证券、信达证券、国金证券、广发证券等单位共计300余人…

【数据结构】链表经典OJ题目练习(2)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode) 思路1:先计算出链表的长度,在将链表中的值存在数组中,在返回第k个节点。 思路2:利用快慢指针,先让快指针走k步,在让快慢指针分…