【SOAP 您所在的位置:网站首页 soap的三个部分 【SOAP

【SOAP

2023-12-18 00:04| 来源: 网络整理| 查看: 265

文章目录 SOAP是什么?SOAP消息实例SOAP和HTTPSOAP对HTTP的误用

w3c-Simple Object Access Protocol (SOAP) 1.1 w3school:SOAP IBM文档 SOAP Apache文档 webservices-axis

SOAP是什么?

SOAP(Simple Object Access Protocol,即简单对象访问协议) ,是一个轻量级协议,用于在分散的分布式环境中使用XML在对等体之间交换结构化和类型化的信息。或者更简单地说:SOAP是一个基于XML的通信协议 (SOAP被认为是第二代XML协议,第一代具有代表性的技术叫XML-RPC)

SOAP使用XML数据格式,以描述调用的远程接口、参数、返回值和出错信息等等。它可以基于多种传输协议来传递消息(HTTP/HTTPS、SMTP、TCP、UDP等)。 SOAP本身没有定义任何应用程序的语义,如编程模型或特定的实现语义。相反,它通过提供一个模块化的包装模型和编码机制来表达应用程序语义的简单机制,用于在模块中编码数据。这使得SOAP可以被用于从消息系统到RPC的大量系统中

SOAP标准由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,并得到 莲花(Lotus)、康柏(Compaq)等公司的支持,于2000年提交给万维网联盟(World Wide Web Consortium,W3C)

SOAP由三部分组成:

信封。所谓信封就是指一个SOAP消息,它定义了一个SOAP消息的框架,用于表达数据内容。 一条SOAP消息就是一个XML文档,包含以下元素 Envelope:必须的。它SOAP消息的根元素。就是它把 XML 文档定义为 SOAP 消息。Header:可选的。它是一个扩展,可用于包含有关 SOAP 消息的应用程序的专用信息(比如身份验证、支付等)Body:必须的。它包含SOAP消息的正文Fault:可选的。它用来携带错误或状态信息 编码规则。SOAP定义了一种 程序数据类型和XML 的编码规则,用于将程序对象和XML进行序列化和反序列化。RPC表示法:SOAP定义了一种 远程过程调用和响应的约定/表示规则(它定义了过程的调用需要哪些信息,以及如何在信封中表示)。SOAP 的设计目标之一是使用 XML 的可扩展性和灵活性来封装和交换 RPC 调用。将SOAP用于RPC 和 SOAP绑定于什么协议 是正交的(不相关的)。在使用HTTP作为协议绑定的情况下,RPC调用自然映射到HTTP请求,RPC响应映射到HTTP响应。然而,将SOAP用于RPC并不局限于HTTP协议绑定。

应用发展 架构师们在设计一个东西的时候,并不会将它与某种应用绑死,SOAP也是如此。但从SOAP被提交给w3c(万维网联盟)便能看出,SOAP其实是为web设计的

SOAP主要用于web服务的数据交换(通信),它与WSDL、UDDI共同组成了用于实现早期web服务的一项技术标准——SOAP-WebService。在软件巨头们的带领下,这项技术被迅速推广应用

SOAP-WebServices:基于SOAP的Web服务,是早期的一种实现web服务的方案(早就过时了,现在都是用REST实现web服务),这种方案基于SOAP(服务调用)、WSDL(服务接口描述)、UDDI(服务发现)三个要素进行构建。—【WebServices系列】详解WebServices (SOAP-WebService & REST)

正因为这样,有很多资料表达出 SOAP是用于访问早期Web服务(SOAP-WebServices)的协议,只能说这种说法无可厚非。

后来随着SOAP-WebServices的广泛应用,不断地增加附加的内容,SOAP开始变得重量化,使用门槛变高,而且随着需求的增长,又不得增加协议以支持安全性,这使SOAP变得异常庞大,背离了简单的初衷。在SOAP-WebServices后续的发展过程中,WS-*一系列协议的制定,增加了SOAP的成熟度,也给SOAP增加了负担。

用一个简单的例子来说明SOAP 的使用过程:一个 SOAP 消息可以发送到一个具有 SOAP-WebServices 的 Web 站点。例如,一个含有房价信息的数据库,消息的参数中标明这是一个查询消息,此站点将返回一个 XML 格式的信息,其中包含了查询结果 (价格,位置,特点,或者其他信息)。由于数据是用一种标准化的可分析的结构来传递的,所以可以直接被站点所利用。

SOAP消息实例

摘自 w3school:SOAP 实例

在下面的例子中:一个 GetStockPrice 请求被发送到了服务器,此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数,此功能的命名空间被定义在此地址中: http://www.example.org/stock

SOAP请求

POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn IBM

SOAP响应

HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn 34.5 SOAP和HTTP

虽然SOAP独立于传输,但它通常都绑定到HTTP,这是为什么呢?

————

SOAP是基于HTTP的吗? 上面的内容已经提到,SOAP可以使用多种网络协议进行传输。它的重点是提供数据交换的格式规范,本质立场是中立的,并非只能绑定到HTTP。

————

那为什么大家都将SOAP绑定到HTTP呢?这么做的好处是什么?

SOAP的主要目的是用在web服务系统中进行数据交换,而http是最优的选择

1. HTTP本身的优势

web服务是指使用web技术(http、url等)构建的信息服务,http是被设计用于web系统进行信息交换的协议,它适配这些web技术。SOAP如果不使用HTTP,就要创建一个新的适配web技术的传输协议

http是应用层协议,并且是短连接的、很流行的协议。用它来交换web服务数据十分轻松简单,因为它不必像tcp/udp一样需要控制创建、连接和断开,不必进行二进制的封包和解包

2. HTTP完善的技术设施

HTTP被设计作为web数据通信的基础,任何服务器想要提供http服务,都必须让防火墙放行http流量(通常是80/http。80端口是http协议规范指定的标准端口/默认端口,如果web服务使用该端口提供访问,则请求的URI中通常可以省略该部分,大多数http库都提供了该默认值,否则必须写明端口号)。 大多数网络管理员不允许企业的任何端口打开,除了80/http,因为他们要对外部提供web服务。如果SOAP绑定于其它协议,首先要劝说网络管理员开放另外的端口,然而即便给你开放了,但也会因此出现了安全隐患。80/http之所以可以被大家轻松地开放,不仅仅因为是提供web服务访问的需要,还因为http和web服务器(Apache、Nginx等)经过了多年的测试,因此保护它变得"更容易"。而如果为你的SOAP服务另外开放一个端口,该端口将赤裸地(不像http可以通过web服务器转发)连接到你的程序,而它没有经过时间的检验,很可能会有各种各样的安全隐患。 所以,SOAP绑定于HTTP,可以利用HTTP的成熟的基础设施(http本身和成熟的web服务器等),与其它http消息一样轻松穿越防火墙、没有额外的安全隐患。部署web服务没有额外的成本。

IBM文档中也有了类似的粗略解释 IBM文档-SOAP 在这里插入图片描述

所以,有HTTP这么好的载体,当然是拿来就用。

最后,让SOAP绑定到HTTP成为一个普遍行为,还少不了一个关键性的引导。这会让那些不知道为什么这么做的人也都纷纷这么做。 那就是 w3c的SOAP手册中仅仅且专门将HTTP作为SOAP的使用示例

w3c-Simple Object Access Protocol (SOAP) 1.1w3c-soap文档(deepl翻译) 在这里插入图片描述

————

其它参考 Why does a SOAP message have to be sent over HTTP? 在这里插入图片描述

SOAP对HTTP的误用

实际上,SOAP对HTTP完全是一种误用,一些资料对这种行为进行了批评

截自 REST论文《架构风格与基于网络应用软件的架构设计》 在这里插入图片描述 截自 期刊《REST与SOAP的冲突》 在这里插入图片描述 ———— 值得一提的是,这些权威资料仅仅批评"SOAP利用http穿越防火墙,使得防火墙失去了意义",这并不全面。会让人特别深究于这个原因但又无法充分地说服自己。刚才已经提到,SOAP利用http穿越防火墙只是一方面。http的流行、易用、基础设施的成熟和完善、部署web服务不需要额外的成本,这些原因其实比穿越防火墙更具有说服力

SOAP对HTTP的误用主要体现在两个方面

1. SOAP没有充分认识HTTP本身的含义

构建web服务有一个更好的方案叫REST,将REST应用于HTTP可以构建出非常简洁漂亮的web服务,HTTP提供了完备的语义来用于构建web服务,但在那时人们没有意识到这一点。 其实如果当时就认识到HTTP的正确用法,是不会有SOAP这个东西的

延伸阅读:《REST杂谈:REST发展初期的坎坷之路(技术环境分析以及REST和SOAP的冲突)》、《【WebServices系列】详解WebServices (SOAP-WebServices & RESTful WebServices) 》

2. 利用HTTP穿越防火墙

其实我并不觉得这是一个原因(上面引用资料的时候已经说了),但还是想尝试理解一下这些资料为什么进行这种批评。即我们暂时说服自己SOAP确实是因为想穿越防火墙才使用HTTP。

HTTP被设计作为web数据通信的基础,它经历了多年的发展日渐成熟,相关基础设施(如web服务器)也变得完善。HTTP本身提供了用于web的完整的特性,这可以让我们充分地利用它本身来构建web服务。

SOAP是在HTTP之上进行的再封装,他仅仅把HTTP作为传输工具,而没有充分利用HTTP本身。由于没有经历过时间的考验,它可能会存在一些安全漏洞。 从长远来看,一旦这种基于HTTP再封装协议的用法变得流行,防火墙厂商就不得不进行额外的过滤来保证安全,因为这些用法的大量出现会为网络黑客提供目标,服务器更容易受到攻击。 SOAP后来因为增加安全性而导致它变得越来越笨重,所以这种安全隐患是真实存在的

因此,在HTTP之上做这些扩展是没有意义的,如果HTTP本身就可以做这件事,就应该正确地让它来做。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有