SOAP技术与B2B应用集成(1)

SOAP 技术与 B2B 应用集成( 1 )

柴晓路

2002-4-26

本文最初由 IBM developerWorks中国网站发表,其网址是
http://www.ibm.com/developerWorks/cn/

SOAP 技术及应用概览

自 XML 技术被引入到 B2B 电子商务应用中去,人们发现在 B2B 电子商务应用环境中, XML 的确是一个非常优秀而且极为适合的技术。 XML 作为基于 Internet 环境多点数据交换的最佳技术完全适合在 B2B 电子商务环境中的多个企业 / 应用之间交换各类商务信息。 B2B 电子商务说到低就是要让企业间的商务消息能够广泛地交换,能够在一系列的企业应用中流转,而实现完整的 B2B 电子信息流,以极大可能地减少人工干预,提高商务运转的效率,获得更多的商务机会。

为了实现这一目的,各个 B2B Solution/Software 的提供商,如 CommerceOne 、 Ariba 等分别制订了用于 B2B 应用之间交换商务消息的 XML 格式 (XML Application) ,它们包括 CommerceOne 的 xCBL(XML Common Business Library) 、 Ariba 的 cXML(Commerce XML) 、 Microsoft 的 BizTalk 等,这些交换格式已经在众多的 B2B 应用中使用。在 2000 年,联合国的 UN/CEFACT 与 OASIS 联手开始制定全球电子商务的信息交换格式 ebXML ,完全确立了 XML 作为商务应用中信息交换的标准技术的地位。使用 XML 来描述商务信息使得各种 B2B 应用在数据层上获得了开放集成的能力。然而从技术的角度来看,这仅仅完成了应用领域中最低层次的集成:数据层集成。集成的双方必须就数据之外的系统细节达成一致,必须了解对方的接受方式,网络协议,访问入口,安全性要求等,在模块层,应用层仍然停留在一个不利于集成的阶段。

正是为了解决模块层能够以一种开放的,自说明的,统一的方式进行集成和交互, IBM 、 Microsoft 、 DevelopMentor 等公司协作制订了 Simple Object Access Protocol (SOAP) 规范。 SOAP 是在 XML 基础上定义的,完全继承了 XML 的开放性和描述可扩展性。 SOAP 使用现有基于 TCP/IP 的应用层协议 HTTP 、 SMTP 、 POP3 等,可以获得与现有通信技术最大程度地兼容。 SOAP 的消息路径机制和可扩充的 Header 和 Body 机制又为分布式计算提供了很好的支持。

SOAP 技术概览

SOAP 为在一个松散的、分布的环境中使用 XML 对等地交换结构化的和类型化的信息提供了一个简单的轻量级机制。 SOAP 本身并不定义任何应用语义,如编程模型或特定语义实现,它只是定义了一种简单的机制,通过一个模块化的包装模型和对模块中特定格式编码的数据重编码机制来表示应用语义。 SOAP 的这项能力使得它可被很多类型的系统用于从消息系统到 RPC(Remote Procedure Call) 的延伸。

SOAP 规范主要由三部分组成:

§ SOAP 信封 (envelop) ,它构造定义了一个整体的 SOAP 消息表示框架,可用于表示消息中的内容是什么,是谁发送的,谁应当接受并处理它,以及这些处理操作是可选的还是必须的等。

§ SOAP 编码规则 (encoding rules) ,定义了一个数据的编码机制,通过这样一个编码机制来定义应用程序中需要使用的数据类型,并可用于交换由这些应用程序定义的数据类型所衍生的实例。例如可能应订单服务的需要,使用 SOAP 编码规则定义了订单的数据类型,并可以在订单生成的客户端与订单服务之间交换订单实例。

§ SOAP RPC 表示 (RPC representation) ,定义了一个用于表示远端过程调用和响应的约定,例如如何使用 HTTP 或 SMTP 协议与 SOAP 绑定,如何传输过程调用,在具体传输协议的哪个部分传输过程响应,如我们可以在 HTTP 的响应的时候传递过程响应。

虽然这三部分是作为 SOAP 的不同部分作为一个整体定义的,但他们在功能上是正交的、彼此独立的。特别的,信封和编码规则是被定义在不同的 XML 命名空间 (namespace) 中,这样有利于通过模块化获得定义和实现的简明性。

由于 SOAP 的主要设计目标是简明性和可扩展性。这就意味着有一些传统消息系统或分布式对象系统中的特性将不包含在 SOAP 的核心规范中。这些特性包括:分布式垃圾收集 (Distributed garbage collection) 、成批消息传输 / 处理 (Boxcarring or batching of messages) 、对象引用 (Objects-by-reference) 、对象激活 (Activation ) 。

下面我首先给出一个使用 SOAP 调用 B2B 服务的一个例子,让大家对使用 SOAP 来访问 B2B 服务,最终获得 B2B 服务的交互和集成有一个初步的和感性的认识:

在这个例子中,将向产品报价 (ProductQuote) 服务提交一个获取最新交易价格 (GetLastProductPrice) 的 SOAP 请求。请求将包含一个字串型的参数,指明需要报价的产品代号,而在 SOAP 响应中则包含一个实数的价格。 SOAP 信封元素是表示 SOAP 消息的 XML 文档的根元素。 XML 命名空间则用来消除 SOAP 标识符与应用定义的标识符之间可能存在的理解歧义。这个例子使用了 SOAP 的 HTTP bindings , SOAP 消息总是通过某一种网络传输协议来实施传输,因此在以后的篇幅中,我总是将 SOAP 绑定在某种协议上进行阐述,比如 HTTP 。

POST /ProductQuote HTTP/1.1
Host: b2bService.dealeasy.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

1<soap-env:envelope envelope="" http:="" schemas.xmlsoap.org="" soap="" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="”" ”="">
2<soap-env:body>
3<dealeasyb2b:getlastproductprice xmlns:dealeasyb2b="Some-URI">
4<referenceid>Jaguar_X_Type</referenceid>
5</dealeasyb2b:getlastproductprice>
6</soap-env:body>
7</soap-env:envelope>

上面的 SOAP 消息是调用请求,下面的 SOAP 消息是调用响应:

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

1<soap-env:envelope soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
2<soap-env:body>
3<dealeasyb2b:getlastproductpriceresponse xmlns:dealeasyb2b="Some-URI">
4<price>243900.00</price>
5</dealeasyb2b:getlastproductpriceresponse>
6</soap-env:body>
7</soap-env:envelope>

SOAP 的消息交换模型

从根本上来看, SOAP 消息是从发送方到接受方的一种传输方法,但就象前面例子中阐述的那样, SOAP 消息一般会和实现模式结合,例如请求 / 响应。 SOAP 的实现可以为特殊网络系统的特有特征来优化。例如,通过 HTTP binding 将 SOAP 响应消息通过 HTTP 响应来传输,请求和响应使用同一连接。

然而,无论 SOAP 是与哪种协议绑定,消息都可以通过消息路径 (message path) 来指定路线发送,消息路径机制使消息在到达最终目的地之前可以在一个或多个中间介上处理。这是一个非常有用、且及其适合分布式计算环境的一个机制。例如一个申请订单的消息可以首先到达帐户服务 (AccountAuthentication Service) 确认身份获取权限,然后到达产品价格查询服务 (ProductQuote Service) 获得所需产品的最新价格,然后进入订单服务 (PurchaseOrder Service) 根据所得的最新价格产生订单并响应调用者。通过这样一种机制可以实现基于模块化服务设计基础的 B2B 商务流程实现,通过低耦合模块的统一集成获得良好的系统体系和功能实现。

通常,一个收到 SOAP 消息的 SOAP 应用程序必须按照以下规范、通过执行下面这些动作来处理这个 SOAP 消息:

1 .找到并标识该 SOAP 消息中所有为该应用程序设置的部分。例如,在前面的例子中, AccountAuthentication Service 就需要找到并标识消息中的帐户信息 (Account Info) 部分。

2 .校验该消息在前一步中获得的被标识的部分中所有的必须处理的部分 ( 在 SOAP 消息规范中支持强制处理部分和可选处理部分,这一功能的实现是通过对文档片断加以属性修饰而实现的 ) ,并处理这些部分。如果这部分的内容不符合双方约定的默认定义,则丢弃该消息。处理器可以忽略在第一步中获得的被标识的部分中的可选部分,如果这些可选部分不会影响处理的结果。例如上面的例子中,第一步完成帐户校验后,在消息中删除 Account Info ,生成一个 Session Key ,加入该 SOAP 消息,同时向 ProductQuote Service 转发该消息。

3 .如果该 SOAP 应用程序不是该消息的最终目的地,则在该消息中删除所有在第一步中标识的部分,如果有必要的话,附加上处理的结果部分,并转发该消息。

为了处理一条消息或消息的部分, SOAP 处理器需要理解:使用的交换方式 ( 包括单向 , 请求 / 响应,广播等 ) 、该方式中消息接受者的角色、 RPC 机制的使用方法 ( 如果有的话 ) 、消息中数据的编码或表示方式以及对于正确处理所必须了解的另一些语义。

SOAP 消息交换的例子

为了给大家一个感性的认识,我们就结合前面举的申请订单的例子来看一看 SOAP 消息应该如何来实现,通过对这样一种机制的理解,我们会发现我们完全可以以这样一种方式来实现这样一个服务网络。 AccountAuthentication Service 可以位于 CA 认证中心,由认证中心生成 Session Key ,该 Session Key 的安全性由 CA 认证中心保证; ProductQuote Service 位于某一个 e-Marketplace ,一般企业都会把自己的产品信息发布到 e-Marketplace 上以寻求更多的商业机会; PurchaseOrder Service 则可以位于提供该产品的企业的 e-Procurement Site ,这样企业可以很方便地在标准框架下修改采购流程和订单明细力度等。

下面就是这一个跨越多个 Service 的调用的 SOAP 消息示例:

Message I: Request a Purchase Order with AccountInfo and PruductID

POST /AccountAuthentication HTTP/1.1
Host: port.CA.com.cn
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

 1<soap-env:envelope envelope="" http:="" schemas.xmlsoap.org="" soap="" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="”" ”="">
 2<soap-env:header>
 3<unib2b:requestauthentication xmlns:unib2b="”Some-URI”">
 4<accountname>DealEasy</accountname>
 5<accountpassword>12345</accountpassword>
 6</unib2b:requestauthentication>
 7<unib2b:requestproductinfo targetemarketplace="”http://service.eMarketplace.com.cn/ProductQuote”" xmlns:unib2b="”Some-URI”">
 8<productid>Jaguar_X_Type</productid>
 9<finalusage function="RequestPurchaseOrder"></finalusage>
10</unib2b:requestproductinfo>
11</soap-env:header>
12<soap-env:body>
13<unib2b:requestpurchaseorder xmlns:unib2b="Some-URI">
14<productid>Jaguar_X_Type</productid>
15</unib2b:requestpurchaseorder>
16</soap-env:body>
17</soap-env:envelope>

Message II: Request a Purchase Order with SessionKey and PruductID

POST /ProductQuote HTTP/1.1
Host: service.eMarketplace.com.cn
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

 1<soap-env:envelope envelope="" http:="" schemas.xmlsoap.org="" soap="" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="”" ”="">
 2<soap-env:header>
 3<unib2b:accessauthenticated xmlns:unib2b="”Some-URI”">
 4<sessionkey>76E4#12A@-98JA#V5GQ</sessionkey>
 5</unib2b:accessauthenticated>
 6<unib2b:requestproductinfo targetemarketplace="”http://service.eMarketplace.com.cn/ProductQuote”" xmlns:unib2b="”Some-URI”">
 7<productid>Jaguar_X_Type</productid>
 8<finalusage function="RequestPurchaseOrder"></finalusage>
 9</unib2b:requestproductinfo>
10</soap-env:header>
11<soap-env:body>
12<unib2b:requestpurchaseorder xmlns:unib2b="Some-URI">
13<productid>Jaguar_X_Type</productid>
14</unib2b:requestpurchaseorder>
15</soap-env:body>
16</soap-env:envelope>

Message III: Request a Purchase Order with SessionKey, PruductID and PruductPrice

POST /ProductQuote HTTP/1.1
Host: service.eMarketplace.com.cn
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

 1<soap-env:envelope envelope="" http:="" schemas.xmlsoap.org="" soap="" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="”" ”="">
 2<soap-env:header>
 3<unib2b:accessauthenticated xmlns:unib2b="”Some-URI”">
 4<sessionkey>76E4#12A@-98JA#V5GQ</sessionkey>
 5</unib2b:accessauthenticated>
 6<unib2b:getlastproductprice xmlns:unib2b="Some-URI">
 7<price>243900.00</price>
 8</unib2b:getlastproductprice>
 9</soap-env:header>
10<soap-env:body>
11<unib2b:requestpurchaseorder xmlns:unib2b="Some-URI">
12<productid>Jaguar_X_Type</productid>
13<productprice>243900.00</productprice>
14</unib2b:requestpurchaseorder>
15</soap-env:body>
16</soap-env:envelope>

Message IV: Response a Purchase Order with PruductID and PruductPrice

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

 1<soap-env:envelope envelope="" http:="" schemas.xmlsoap.org="" soap="" soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="”" ”="">
 2<soap-env:body>
 3<unib2b:responsepurchaseorder xmlns:unib2b="Some-URI">
 4<orderid>AJR786503</orderid>
 5<authenticatedid>76E4#12A@-98JA#V5GQ</authenticatedid>
 6<productid>Jaguar_X_Type</productid>
 7<productprice>243900.00</productprice>
 8<productnumber>1</productnumber>
 9<issuedate>2001-4-1</issuedate>
10</unib2b:responsepurchaseorder>
11</soap-env:body>
12</soap-env:envelope>

结语

本文以概览的方式介绍了 SOAP 技术是如何使 B2B 应用在一个通用开放和广泛的环境下协同工作及相互集成。在大家对 SOAP 技术有一个初步的了解之后,我将在以后的文章中,依次详细介绍 SOAP 信封的结构及应用, SOAP 编码方式与其他 XML 模式的关系及应用以及 SOAP 的 RPC 规范及应用。

参考资料

1. 技术规范

UDDI, SOAP, WSDL, XML Schema

2. 开发软件包

MSSOAPKIT,

Published At
Categories with Web编程
Tagged with
comments powered by Disqus