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

news2024/11/23 7:52:18

原文链接: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 全生命周期管理资料

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

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

相关文章

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案,旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台,现在已经开源,并在国际物联网领域受到广泛关注。 功能描述 多协…

25-ESP32-S3 内置的真随机数发生器(RNG)

ESP32-S3 内置的真随机数发生器(RNG)😎 引言 📚 在许多应用中,随机数发生器(RNG)是必不可少的。无论是在密码学🔒、游戏🎮、模拟🧪或其他领域,随…

北邮22级信通院DSP:实验三(1):FFT变换、IFFT变换(附每步8点变换蝶形图)保姆级讲解+用C++程序实现复数域的FFT变换和IFFT变换

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章,欢迎关注~ 获取更多文章,请访问专栏: 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、预备知识 1.1 FFT算法 1.2.1由DFT到FFT 1.2.2 基2时域抽选算法 …

springboot3项目练习详细步骤(第二部分:文章分类模块)

新增文章分类 接口文档 业务实现 参数校验 文章分类列表 接口文档 业务实现 获取文章分类详情 接口文档 业务实现 更新文章分类 接口文档 业务实现 分组校验 问题 概念 实现步骤 总结 删除文章分类 接口文档 业务实现 该模块大部分请求的路径相同&…

使用gird布局实现表格(解决边框重叠问题)

<div class"quickInput"><div class"quickInputTable"><span class"quickInputTitleStyle">余额快捷输入 (单位&#xff1a;元)</span><div class"box"><div class"btn1" v-for"num …

栈数据结构

1,概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈(push)&#x…

Python爬虫教程:入门爬取网页数据

1.遵守法律法规 爬虫在获取网页数据时&#xff0c;需要遵守以下几点&#xff0c;以确保不违反法律法规&#xff1a; 不得侵犯网站的知识产权&#xff1a;爬虫不得未经授权&#xff0c;获取和复制网站的内容&#xff0c;这包括文本、图片、音频、视频等。 不得违反网站的使用条…

我独自升级崛起下载方法分享 下载教程

《我独自升级&#xff1a;崛起》这款精彩绝伦的动作角色扮演游戏&#xff0c;灵感来源于大热网络漫画&#xff0c;让玩家亲自踏上主角程肖宇的征途&#xff0c;从觉醒初阶到实力飞跃&#xff0c;每一步成长都扣人心弦。值得注意的是&#xff0c;尽管全球正式发布日期定在了五月…

雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 专注 从商业角度看&#xff0c;专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理&#xff0c;大家的第一反应可能是“风险会不会…

符号数学库-sympy

文章目录 前言一、符号声明二、代数运算三、求解方程和方程组1 求解一元方程2 求解方程组四、微积分(求导(包括偏导)求积分等)1 求导(偏导)2 求不定积分与定积分五、解微分方程与微分方程组1 解微分方程2 解微分方程组下面我们玩个有意思的,机器学习中的损失函数总结前言…

PHP基于vscode医院安全不良事件管理系统源码(AEMS)前端vue2+element+后端laravel8不良事件上报与闭环管理

PHP基于vscode医院安全不良事件管理系统源码&#xff08;AEMS&#xff09;前端vue2element后端laravel8不良事件上报与闭环管理 医院不良事件上报与管理系统结合现代医院管理思路&#xff0c;遵照PDCA全面质量循环管理方法而设计&#xff0c;并在多家大型三甲医院成熟运用。系统…

快速找出存(不存在)在某个(或多个)文件的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 想要找出有下面这个文件存在的文件夹 切换到批量文件复制版块&#xff0c;快捷键Ctrl5 右侧&#xff0c;搜索添加 选定范围&#xff0c;勾选搜索文件夹、包…

Go 语言基础之面向对象编程

1、OOP 首先&#xff0c;Go 语言并不是面向对象的语言&#xff0c;只是可以通过一些方法来模拟面向对象。 1.1、封装 Go 语言是通过结构体&#xff08;struct&#xff09;来实现封装的。 1.2、继承 继承主要由下面这三种方式实现&#xff1a; 1.2.1、嵌套匿名字段 //Add…

RISCV 外部GCC 工具链安装@FreeBSD15

在交叉编译的时候&#xff0c;可以使用FreeBSD15默认的工具链&#xff1a;LLVM 也可以使用GCC工具链&#xff0c;GCC可以使用现成pkg包安装&#xff0c;也可以编译安装。 LLVM的特点是高移植性和高效&#xff0c;但学习成本高。GCC的特点是成熟稳定&#xff0c;但优化能力有限…

多线程系列(七) -ThreadLocal 用法及内存泄露分析

一、简介 在 Java web 项目中&#xff0c;想必很多的同学对ThreadLocal这个类并不陌生&#xff0c;它最常用的应用场景就是用来做对象的跨层传递&#xff0c;避免多次传递&#xff0c;打破层次之间的约束。 比如下面这个HttpServletRequest参数传递的简单例子&#xff01; p…

机器学习项目实践-基础知识部分

环境建立 我们做项目第一步就是单独创建一个python环境&#xff0c;Python新的隔离环境 创建&#xff1a;python -m venv ml 使用&#xff1a;.\Scripts\activate python -m venv ml 是在创建一个名为 ml 的虚拟环境&#xff0c;这样系统会自动创建一个文件夹ml&#xff0c;…

[redis] 说一说 redis 的底层数据结构

Redis有动态字符串(sds)、链表(list)、字典(ht)、跳跃表(skiplist)、整数集合(intset)、压缩列表(ziplist) 等底层数据结构。 Redis并没有使用这些数据结构来直接实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对象系统&#xff0c;来表示所有的key-value。 文章…

鸿蒙编译子系统详解(二)main.py

1.5.4源码解析 1.5.4.1 build/hb/main.py脚本 这个脚本是编译的主程序脚本&#xff0c;流程如下&#xff1a; 首先是初始化各种module类&#xff0c;然后运行对应模块。 hb分为build,set,env,clean,tool,help几个模块&#xff0c;模块源码位于build/hb/modules/目录下&#xff…

安卓开发(二)Android开发基础知识

了解Android Android大致可以分为4层架构&#xff1a;Linux内核层、系统运行库层、应用框架层和应用层。 内核层&#xff1a;Android系统是基于Linux内核的&#xff0c;这一层为Android设备的各种硬件提供了底层的驱动&#xff0c;如显示驱动、音频驱动、照相机驱动、蓝牙驱动…

MS2107 宏晶微 音视频采集芯片 提供开发资料

1. 基本介绍 MS2107 是一款视频和音频采集芯片,内部集成 USB2.0 控制器和数据收发模块、视频 ADC模块、音频 ADC 模块和音视频处理模块。MS2107可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。MS2107 输出支持 YUV422 和 MJPEG 两种…