关于 REST API 和 SOAP,你知道多少?

背景

通过上篇文章 关于 REST API,你了解多少?,我们知道REST API是在Web应用程序的发展过程中产生的。在Web应用程序的早期阶段,应用程序之间的通信主要是通过SOAP(Simple Object Access Protocol)和XML-RPC(XML Remote Procedure Call)等协议来实现的。这些协议使用XML格式来传输数据,但它们的设计复杂、繁琐,不易于使用和扩展。

在这种情况下,Roy Fielding在2000年提出了REST(Representational State Transfer)的概念,作为一种新的Web应用程序架构风格。REST使用HTTP协议作为通信协议,使用URI(Uniform Resource Identifier)来标识资源,使用HTTP请求方法(如GET、POST、PUT、DELETE等)来操作资源,并使用HTTP状态码来表示操作结果。REST的设计风格简单、灵活、可扩展,因此在Web应用程序中得到了广泛的应用。

随着Web应用程序的不断发展,REST API已经成为现代Web应用程序的重要组成部分。它可以提高应用程序的互操作性、灵活性和可伸缩性,从而为用户提供更好的体验。那么 REST API 和 SOAP 有什么区别呢?

REST VS SOAP

SOAP全称 Simple Object Access Protocol,定义了一个强类型的消息传递框架,该框架严重依赖于 XML 和 schemas。
REST 全称 REpresentational State Transfer 是一种架构风格,它利用现有且广泛采用的技术,特别是 HTTP,并且不创建任何新标准。 REST 可以将数据结构化为 XML、YAML 或任何其他机器可读格式,但通常首选 JSON。

有无状态

SOAP

SOAP 是一种有状态的协议。在 SOAP 中,每个请求都需要包含一些上下文信息,例如会话标识符、安全令牌等,这些信息需要在每个请求中进行传递。因此,SOAP 需要维护请求之间的状态信息。

举一个具体的例子,假设有一个基于 SOAP 的在线购物系统,用户在登录后可以浏览商品、添加商品到购物车、结算等操作。在这个过程中,服务器需要维护用户的登录状态、购物车信息等上下文信息,以便在后续的请求中进行验证和处理。如果用户在登录后的某个时刻断开了连接,那么服务器需要在一定时间内保留用户的上下文信息,以便用户重新连接后可以继续进行之前的操作。这就是 SOAP 的有状态特性体现的一个例子。

REST

在 REST 中,为了实现无状态的原则,服务器不会维护客户端的会话状态。相反,客户端会在每个请求中包含足够的信息,以便服务器可以理解该请求,而不需要依赖之前的请求或会话状态。

因此,在上述的例子中,如果使用 REST API,服务器不会维护客户端的会话状态,而是在每个请求中包含足够的信息,以便服务器可以理解该请求。例如,在用户登录后,服务器可以返回一个包含访问令牌的响应,客户端可以在后续的请求中包含该访问令牌,以便服务器可以验证客户端的身份和权限。客户端可以在每个请求中包含购物车信息,以便服务器可以处理购物车相关的操作。如果客户端在某个时刻断开连接,那么客户端可以在重新连接后重新发送之前的请求,以便服务器可以继续处理之前的操作。这种方式下,服务器不需要维护客户端的会话状态,从而实现了 REST 的无状态原则。

总结

SOAP 和 REST 是两种不同的架构风格,它们在很多方面都有所不同,其中一个重要的区别就是状态管理。

SOAP 是一种基于 XML 的协议,它使用 SOAP 消息来传输数据。在 SOAP 中,服务端通常会维护客户端的状态信息,因为 SOAP 协议本身并不提供状态管理机制。因此,服务端需要使用一些技术手段来维护客户端的状态信息,如使用 Session 或者 Cookie 等机制。

相比之下,REST 是一种基于 HTTP 协议的架构风格,它使用 HTTP 请求和响应来传输数据。在 REST 中,客户端通常会维护自己的状态信息,因为 HTTP 协议本身就提供了状态管理机制,如使用 Cookie 或者 Token 等机制。因此,REST API 通常是无状态的,服务端不需要维护客户端的状态信息。

总的来说,SOAP 和 REST 在状态管理方面的区别主要是由它们所采用的协议和架构风格所决定的。SOAP 使用的是基于 XML 的协议,而 REST 使用的是基于 HTTP 的协议( REST不限制协议,通常是 HTTP),因此它们在状态管理方面有所不同。

其他

HTTP

HTTP(超文本传输协议)是一种应用层协议,用于在客户端和服务器之间传输数据。HTTP 协议通信流程通常如下:

  1. 客户端向服务器发送 HTTP 请求报文,请求访问某个资源。请求报文包括请求行、请求头和请求体等部分。
  2. 服务器收到请求报文后,解析出请求行、请求头和请求体等部分,并进行相应的处理。处理结果通常包括响应状态码、响应头和响应体等部分。
  3. 服务器将处理结果封装成 HTTP 响应报文,并将其作为 TCP 数据包发送给客户端。响应报文包括状态行、响应头和响应体等部分。
  4. 客户端收到响应报文后,解析出状态行、响应头和响应体等部分,并进行相应的处理。处理结果通常包括显示页面内容、保存文件等操作。

在这个过程中,客户端和服务器之间的通信是基于 TCP 协议的。在建立 TCP 连接之前,客户端需要通过 DNS 解析获取服务器的 IP 地址,然后使用服务器的 IP 地址和端口号来建立 TCP 连接。在 TCP 连接建立之后,客户端和服务器之间就可以通过 HTTP 协议来进行数据传输了。

需要注意的是,HTTP 协议是一种无状态协议,即每个请求和响应之间是相互独立的,服务器不会保存客户端的状态信息。为了解决这个问题,HTTP 协议引入了 Cookie 和 Session 等机制,用于在客户端和服务器之间保存状态信息。

SOAP

SOAP(简单对象访问协议)是一种基于 XML 的协议,用于在客户端和服务器之间传输数据。SOAP 协议通信流程通常如下:

  1. 客户端向服务器发送 HTTP 请求报文,请求调用某个 SOAP 服务。请求报文中包含 SOAP 消息,即要传输的数据。
  2. 服务器收到请求报文后,解析出 SOAP 消息,并进行相应的处理。处理结果通常包括生成响应 SOAP 消息,即要返回给客户端的数据。
  3. 服务器将响应 SOAP 消息封装成 HTTP 响应报文,并将其作为 TCP 数据包发送给客户端。
  4. 客户端收到响应报文后,解析出响应 SOAP 消息,并进行相应的处理。处理结果通常包括显示页面内容、保存文件等操作。

在这个过程中,客户端和服务器之间的通信是基于 HTTP 协议的。客户端向服务器发送的请求报文中包含 SOAP 消息,即要传输的数据。服务器收到请求报文后,解析出 SOAP 消息,并进行相应的处理。处理结果通常包括生成响应 SOAP 消息,即要返回给客户端的数据。服务器将响应 SOAP 消息封装成 HTTP 响应报文,并将其作为 TCP 数据包发送给客户端。客户端收到响应报文后,解析出响应 SOAP 消息,并进行相应的处理。

需要注意的是,SOAP 协议本身并不关心传输协议的具体实现,因此可以使用多种传输协议来传输 SOAP 消息,如 HTTP、SMTP、FTP 等。但是,由于 HTTP 协议广泛应用于互联网上,因此在实际应用中,SOAP 协议通常使用 HTTP 协议作为传输协议。

关于三次握手

HTTP

HTTP 是一种基于 TCP 协议的应用层协议,而 TCP 协议确实是通过三次握手来建立连接的。

在 TCP 协议中,客户端和服务器之间需要进行三次握手来建立连接。具体过程如下:

  1. 客户端向服务器发送 SYN 报文,表示请求建立连接。
  2. 服务器收到 SYN 报文后,向客户端发送 SYN-ACK 报文,表示确认请求,并请求建立连接。
  3. 客户端收到 SYN-ACK 报文后,向服务器发送 ACK 报文,表示确认建立连接。

在建立连接后,客户端和服务器之间可以进行数据传输。在 HTTP 协议中,客户端向服务器发送请求报文,服务器收到请求报文后返回响应报文,然后关闭连接。因此,HTTP 协议并不需要进行三次握手来建立连接,但是它依赖于 TCP 协议来建立可靠的连接。

SOAP

SOAP 协议本身并不需要进行三次握手来建立连接。SOAP 协议通常使用 HTTP 或 HTTPS 作为传输协议,而 HTTP 协议是基于 TCP 协议的,因此在使用 HTTP 作为传输协议时,需要进行三次握手来建立 TCP 连接。

在使用 SOAP 协议时,客户端和服务器之间的通信流程通常如下:

  1. 客户端向服务器发送 HTTP 请求报文,请求调用某个 SOAP 服务。
  2. 服务器收到请求报文后,解析出 SOAP 消息,并进行相应的处理。
  3. 服务器将处理结果封装成 SOAP 响应消息,并将其作为 HTTP 响应报文发送给客户端。
  4. 客户端收到响应报文后,解析出 SOAP 响应消息,并进行相应的处理。

在这个过程中,客户端和服务器之间的 TCP 连接是由 HTTP 协议来管理的,因此需要进行三次握手来建立连接。但是,SOAP 协议本身并不需要进行三次握手,它只是一种消息格式和传输协议规范,用于在客户端和服务器之间进行通信。

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

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

相关文章

递归和迭代【Py/Java/C++三种语言详解】LeetCode每日一题240218【树DFS】LeetCode 589、 N 叉树的前序遍历

有LeetCode算法/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目描述解题思路代码方法一:递归法PythonJavaC时空复杂度 方法二:迭代法PythonJavaC时空复杂度 …

面试redis篇-08数据淘汰策略

原理 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key: noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是…

【Pytorch】模块化

文章目录 1. 获取数据2. 创建Dataset和DataLoader3. 定义模型4. 创建训练模型引擎函数5. 创建保存模型的函数6. 训练、评估并保存模型 模块化涉及将jupyter notebook代码转换为一系列提供类似功能的不同 Python 脚本。 可以将笔记本代码从一系列单元格转换为以下 Python 文件&…

JetBrains系列工具,配置PlantUML绘图

PlantUML是一个很强大的绘图工具,各种图都可以绘制,具体的可以去官网看看,或者百度。 PlantUML简述 https://plantuml.com/zh/ PlantUML语言参考指引 https://plantuml.com/zh/guide PlantUML语言是依赖Graphviz进行解析的。Graphviz是开源…

[设计模式Java实现附plantuml源码~行为型] 撤销功能的实现——备忘录模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

2024程序员容器化上云之旅-第6集-Ubuntu-WSL2-Windows11版:艰难复活

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker和K8s。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统,并打算将其用Docker容器化后用K8s上云。 8 复活重生 周末终于有点属于自己的…

【书籍分享 • 第三期】虚拟化与容器技术

文章目录 一、本书内容二、读者对象三、编辑推荐四、前言4.1 云计算技术的发展4.2 KVM、Docker4.3 本书内容简介4.4 作者简介 五、粉丝福利 一、本书内容 《虚拟化与容器技术》通过深入浅出的方式介绍KVM虚拟化技术与Docker容器技术的概念、原理及实现方法,内容包括…

Linux之安装Nginx、前后端分离项目部署

目录 一、安装Nginx 1.1先一键安装4个依赖 1.2下载并解压安装包 1.3安装nginx,一般我们在nginx都是要安装ssl证书的 1.4 启动nginx服务 1.5开放80端口 1.6配置nginx自启动 1.7修改/etc/rc.d/rc/local的权限 二、多个tomcat负载加后端部署 2.1创建多个tomca…

Windows已经安装了QT 6.3.0,如何再安装一个QT 5.12

要在Windows上安装Qt 5.12,您可以按照以下步骤操作: 下载Qt 5.12:访问Qt官方网站或其他可信赖的来源,下载Qt 5.12的安装包。 下载安装地址 下载安装详细教程 安装问题点 qt安装时“Error during installation process(qt.tools…

react useRef用法

1&#xff0c;保存变量永远不丢失 import React, { useState,useRef } from react export default function App() { const [count,setcount] useState(0) var mycount useRef(0)//保存变量永远不丢失--useRef用的是闭包原理 return( <div> <button onClick{()>…

跨境电商营销进化史:从传统广告到智能化策略的全面探析

随着全球化的不断推进和互联网技术的飞速发展&#xff0c;跨境电商在过去几年里取得了显著的发展。在这个竞争激烈的市场中&#xff0c;企业们纷纷调整营销策略以应对不断变化的消费者需求和市场趋势。本文Nox聚星将和大家探讨跨境电商营销策略的演变过程&#xff0c;从传统的推…

MySQL基础(二)

文章目录 MySQL基础&#xff08;二&#xff09;1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联

【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学…

Python爬虫中的单线程、多线程问题(文末送书)

前言 在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

【Flink精讲】Flink反压调优

Flink 网络流控及反压的介绍&#xff1a; Apache Flink学习网 反压的理解 简单来说&#xff0c; Flink 拓扑中每个节点&#xff08;Task&#xff09;间的数据都以阻塞队列的方式传输&#xff0c;下游来不及消费导致队列被占满后&#xff0c;上游的生产也会被阻塞&#xff0c;…

dpvs 笔记

20、 基于ECMP的多活负载均衡策略 当使用ospf/ECMP来实现高可用&#xff0c;所以keepalived不需要配置vrrp功能。keepalived只使用后端服务健康检查功能。 Equal-Cost Multi-Path Routing (ECMP) ECMP根据SIP-DIP对来选择路由 keepalived 健康检查机制说明 keepalived TCP chec…

深入探索计算机组成原理:构建信息时代的基石

### 深入探索计算机组成原理&#xff1a;构建信息时代的基石 在当代社会&#xff0c;计算机已经渗透到我们生活的方方面面&#xff0c;从家庭到工作场所&#xff0c;从基础科学研究到工业生产&#xff0c;无一不受到其深远影响。这一切的基础都建立在对计算机组成原理的深入理…

GaussDB SQL调优:选择合适的分布列

一、背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数…

Netty NIO 非阻塞模式

1.概要 1.1 说明 使用非阻塞的模式&#xff0c;就可以用一个现场&#xff0c;处理多个客户端的请求了 1.2 要点 ssc.configureBlocking(false);if(sc!null){ sc.configureBlocking(false); channels.add(sc); }if(len>0){ byteBuffer.flip(); 2.代码 2.1 服务端代码 …

Springboot 多级缓存设计与实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…