Soap 的前身是XML-RPC 基于XML 的远程方法调用,类似于Java RMI、CORBA 实现系统对象间的消息传递通信。但后两者有些应用限制,现在流行SOAP。SOAP 的格式都是XML 规范的。
Soap 是定义了一套基于xml 的消息传递方式,这种方式甚至可以用于替代手机短信。但现在主要用于http 消息请求。
为什么需要SOAP?
随着计算机技术的不断发展,现代企业面临的环境越来越复杂,其信息系统大多数为多平台、多系统的复杂系统。这就要求今天的企业解决方案具有广泛的兼容能力,可以支持不同的系统平台、数据格式和多种连接方式,要求在Internet 环境下,实现系统是松散耦合的、跨平台的,与语言无关的,与特定接口无关的,而且要提供对Web 应用程序的可靠访问。
随着异种计算环境的不断增加,各种系统间的互操作性就愈显得必要,要求系统能够无缝地进行通信和共享数据,从而在 Internet 环境下,消除信息孤岛,实现信息共享、进行数据交换,达到信息的一致性。Web services 希望实现不同的系统之间能够用"软件-软件对话"的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于WEB 无缝集成”的目标。
W3C 联盟召开第一次 Web 服务专题研讨会,目的为探索 W3C 应向哪个方向发展才能实现新兴的 Web 服务架构的标准化,期间提出了一个“Web 服务堆栈”的构想,如下图,从图中可以看出,SOAP 在WEB 服务堆栈中作为用于 XML 消息传递的一种非常普遍的协议,发挥着十分重要的作用。
什么是Soap?
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML 的协议,它包括四个部分:
1. SOAP 封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它,以及如何处理它们的框架;
2. SOAP 编码规则(encoding rules)用于表示应用程序需要使用的数据类型的实例;
3. SOAP RPC 表示(RPC representation),表示远程过程调用和应答的协定;
4. SOAP 绑定(binding),使用底层协议交换信息。
虽然这四个部分都作为SOAP 的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。特别的,信封和编码规则是被定义在不同的XML 命名空间(namespace)中,这样使得定义更加简单。
SOAP 的两个主要设计目标是简单性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的某些性质将不是SOAP 规范的一部分。比如:分布式垃圾收集(Distributed garbage collection)、成批传送消息(Boxcarring or batching of messages)、对象引用 (Objects-by-reference,这需要分布式垃圾收集)、对象激活 (Activation,这需要对象引用)。
SOAP 简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC 作为一致性的调用途径,XML 作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET 进行通讯交互。RPC 的描叙可能不大准确,因为SOAP 一开始构思就是要实现平台与环境的无关性和独立性,每一个通过网络的远程调用都可以通过SOAP封装起来,包括DCE(Distributed Computing Environment ) RPC CALLS,COM/DCOM CALLS, CORBA CALLS, JAVA CALLS,etc。
SOAP 使用 HTTP 传送 XML,尽管HTTP 不是有效率的通讯协议,而且 XML 还需要额外的文件解析(parse),两者使得交易的速度大大低于其它方案。但是XML 是一个开放、健全、有语义的讯息机制,而 HTTP 是一个广泛又能避免许多关于防火墙的问题,从而使SOAP 得到了广泛的应用。但是如果效率对你来说很重要,那么你应该多考虑其它的方式,而不要用 SOAP。
客户端发送请求时,不管客户端是什么平台的,首先把请求转换成XML 格式,SOAP网关可自动执行这个转换。为了保证传送时参数、方法名、返回值的唯一性,SOAP 协议使用了一个私有标记表,从而服务端的SOAP 网关可以正确的解析,这有点类似于COM/DCOM 中的桩(STUB)。转化成XML 格式后,SOAP 终端名(远程调用方法名)及其他的一些协议标识信息被封装成HTTP 请求,然后发送给服务器。如果应用程序要求,服务器返回一个HTTP 应答信息给客户端。与通常对HTML 页面的HTTP GET 请求不同的是,此请求设置了一些HTTP HEADER,标识着一个SOAP 服务激发,和HTTP 包一起传送。例如:对于一个询问股票价格的应用程序,服务器端具有组件提供某股票当前的价格,组件是COM 或CORBA 在服务器上建立的。客户端发送一个SOAP 请求给服务器询问股票价格。服务器依赖于服务器上的SOAP 网关,使用内嵌的HTML 对象调用合适的方法, 然后把得到的价格通过SOAP 应答传给客户端。
SOAP 是一个协议,与编程语言无关。实际上,许多语言已经开始支持SOAP,如:
java,c/c++,vb,c#,perl,php.