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

类别:.NET开发 点击:0 评论:0 推荐:

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

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

SOAP技术概览

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

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

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

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

§         SOAP RPC表示(RPC representation),定义了一个用于表示远端过程调用和响应的约定,例如如何使用HTTPSMTP协议与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标识符与应用定义的标识符之间可能存在的理解歧义。这个例子使用了SOAPHTTP bindingsSOAP消息总是通过某一种网络传输协议来实施传输,因此在以后的篇幅中,我总是将SOAP绑定在某种协议上进行阐述,比如HTTP

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

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV=”
http://schemas.xmlsoap.org/soap/envelope/
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
       <DealEasyB2B:GetLastProductPrice xmlns:DealEasyB2B ="Some-URI">
           <referenceID>Jaguar_X_Type</referenceID >
       </DealEasyB2B:GetLastProductPrice>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

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

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

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
       <DealEasyB2B:GetLastProductPriceResponse
         xmlns:DealEasyB2B="Some-URI">
           <Price>243900.00</Price>
       </DealEasyB2B:GetLastProductPriceResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP的消息交换模型

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

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV=”
http://schemas.xmlsoap.org/soap/envelope/
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header>
       <uniB2B:RequestAuthentication xmlns:uniB2B=”Some-URI”>
           <AccountName>DealEasy</AccountName>
           <AccountPassword>12345</AccountPassword>
       </uniB2B:RequestAuthentication>
       <uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
            targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
           <ProductID>Jaguar_X_Type</ProductID >
           <FinalUsage function="RequestPurchaseOrder" />
       </uniB2B:RequestProductInfo>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</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"

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV=”
http://schemas.xmlsoap.org/soap/envelope/
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header>
       <uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
           <SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
       </uniB2B:AccessAuthenticated >
       <uniB2B:RequestProductInfo xmlns:uniB2B=”Some-URI”
            targetEMarketplace=”http://service.eMarketplace.com.cn/ProductQuote”>
           <ProductID>Jaguar_X_Type</ProductID >
           <FinalUsage function="RequestPurchaseOrder" />
       </uniB2B:RequestProductInfo>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</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"

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV=”
http://schemas.xmlsoap.org/soap/envelope/
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header>
       <uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
           <SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
       </uniB2B:AccessAuthenticated >
         <uniB2B:GetLastProductPrice xmlns:uniB2B ="Some-URI">
              <Price>243900.00</Price>
         </uniB2B:GetLastProductPrice>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
       <uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
           <ProductID>Jaguar_X_Type</ProductID >
           <ProductPrice>243900.00</ProductPrice>
       </uniB2B:RequestPurchaseOrder >
   </SOAP-ENV:Body>
</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

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV=”
http://schemas.xmlsoap.org/soap/envelope/
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
       <uniB2B:ResponsePurchaseOrder xmlns:uniB2B ="Some-URI">
           <OrderID>AJR786503</OrderID>
           <AuthenticatedID>76E4#12A@-98JA#V5GQ</AuthenticatedID>
           <ProductID>Jaguar_X_Type</ProductID >
           <ProductPrice>243900.00</ProductPrice>
           <ProductNumber>1</ProductNumber>
           <IssueDate>2001-4-1</IssueDate>
       </uniB2B:ResponsePurchaseOrder >
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 

结语

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

 

参考资料

1.      技术规范

UDDI, SOAP, WSDL, XML Schema

2.      开发软件包

MSSOAPKIT,

本文地址:http://com.8s8s.com/it/it46000.htm