3.1.1 SOAP
当商业伙伴用UDDI寻找你的WSDL描述时,他们可以使用SOAP (Simple Object Access Protocol)调用你的网络服务一个或多个操作。
SOAP支持一系列诸如HTTP(S)和SMTP的底层协议,可用XML文档进行商业方法请求。使用XML是因为它是语言无关的、可扩展的和坚实的工业标准支持。使用HTTP是因为任何可以连通Internet的系统能够在端口上进行通讯,它是一个能够和任何系统交互的协议,而且它能利用80号端口通过防火墙设置。
SOAP的威力来自于它的简单。SOAP是轻量(lightweight)的且十分容易理解也容易实现的技术。它基于工业动力且被所有大的电子商务平台支持。
从技术的角度来说,SOAP规范了如何各种调用事务片(“call administrivia”)也规定了如何编码参数。一个SOAP envelope封装了可选的头部和主体信息。它通常通过HTTP的POST动作与HTTP服务器交互,也可以用其它形式来传输(如SMTP也是可以的)。SOAP同时支持消息发送和RPC调用的语义。
下面是一个被传送的SOAP调用:
POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.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:Header>
<t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>SUNW</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
3.1.2 JAX/RPC
为了帮助开发者建立基于XML的请求,JCP正在开发Java APIs for XML based RPC (JAX/RPC)。JAX/RPC用于发送和接收诸如SOAP或者XMLP((XML Protocol,在http://www.w3.org/2000/xp/有详细信息)的过程调用。JAX/RPC让你从各种协议的繁文缛节中摆脱出来,提供快速开发的方法。这样就可以不在需要直接处理XML文档了。
现在有很多第三方的SOAP实现方案。开发者可以不同层次的自动化手段来进行开发,繁多的API把程序员缠住了。将来JAX/RPC会代替这些API,提供一个基于现在各种实现的统一的接口。JAX/RPC提供一个统一的接口来建立和处理RPC调用并且自动转换输入输出参数。
当从商业伙伴收到一个SOAP请求时,一个Java servlet使用JAX/RPC接收基于XML的请求。一旦请求被接收,servlet进行事物处理并返回结果给商业伙伴。
3.1.3 ebXML
为了更多的商业交互,需要在商业交互、多请求传输、纲要(schemas)和文档流的结构上达成协议。虽然SOAP提供你能建立扩展商业交互的一个底层的基础,但是你可能需要一个高级的框架来解决这些上述的问题。
这些是ebXML的目的,ebXML是一套XML规范和相关的处理和行为,它们被设计用来提供B2B的协作和集成的基本架构。它是一个全面的规范,能够为商家接受合作伙伴以及引导商业运作带来革新。下面是ebXML标准中关键的几个组成部分。
Collaboration Protocol Profile (CPP)
CPP描述一个公司提供一个标准的、可移植的方案。特别的,它描述一个公司支持的消息交互的能力和商业协作。它也描述公司的商业进度,包括合作伙伴如何与公司交互。CPP上一个有趣的面是商业合作包括B2B传输双方的两面。例如,在销售状态,CPP能够描述不止是销售进度和销售商的语义,而且还描述购买的进度和购买者的语义。
Collaboration Protocol Agreement (CPA)
CPA描述两个公司交互的精确机制和需求。它被手工或者自动由CPP的相关部分建立,它被双方检阅和达成协议。CPA成为双方的合同,它规定特定合作中接轨的方案(“rules of engagement”)。
CPP和CPA的例子和详细规范可以在下面地址找到:
http://ebxml.org/project_teams/trade_partner/cpp-example.xml
http://ebxml.org/project_teams/trade_partner/cpa-example.xml
http://www.ebxml.org/specs/ebCCP.pdf
商业进度和信息模型(Business Process and Information Modeling)
ebXML也包括用XML描述商业进度的规范。它包括传输、文档流、二进制合作数据封装格式以及更多。这些规范在建立CPP时被作者使用也被用于描述和共享商业进度和信息格式。
核心组件(Core Components)
ebXML标准的另一个至关重要的部分是一系列XML schema,也被叫做核心组件。这些schema包括商业数据的格式,例如日期、税收总量、帐目拥有者、交换合同等。它们是特定商业架构和实体,但是不和任何垂直工业(vertical industry)靠齐。
消息传送(Messaging)
ebXML消息传送是用所有相关的面向消息的中间件语义(如:同步/异步,可靠选项)封装消息的格式。特别的,一个ebXML消息传送代表一个可见的CPA的执行体,也拥有指定用来加强接轨的方案(“rules of engagement”)的特征。
ebXML消息传送建立在SOAP封装的消息传送调用(相对于RPC风格的调用)的基础之上。它加入分层的框架来支持附件、安全、和可靠发送从而扩展了SOAP协议。
注册表/知识库(Registry/Repository)
ebXML的注册表/知识库是存储CPP、CPA、ebXML核心组件以及其它ebXML文档和块的服务,它包括强大的查询能力帮助用户搜索相关组件和实质的商业伙伴。JAXR API也能够用于访问ebXML注册表。存储在ebXML注册表中CPP定义的商业服务能被发布到UDDI中。一个关键的概念是UDDI提供一个全局的单一的参照源,而ebXML知识库则提供一个局部的内部数据存储容器。因此,在广域网服务语义中,一个实际的商业伙伴会首先查找UDDI服务,它包括实际存储在ebXML知识库中的CPP或其它文档的引用信息。
3.1.4 JAXM
当收到一个商业伙伴的网络服务请求时,在我们的servlet中,如同我们用JAX/RPC处理SOAP请求一样我们需要一个Java API处理ebXML信息。
The Java API for XML Messaging (JAXM)是一个将要制订的规范,它用于与诸如ebXML消息和SOAP消息的XML消息标准。这个API被设计用于辅助XML消息协议的处理,特别是对于哪里原有定义的“合同”(ebXML是一个特例)来决定消息格式和消息约束。这个API会处理所有“封装(envelope)”信息。例如消息中的过程信息。这让开发者集中注意力于有效载荷的交互而忽略其它细枝末节。
虽然现在开发者可以使用JAXP来实现JAXM将提供的功能,JAXM能够提供一个专门用于基于XML的消息发送的API集。它会大量简化任务且为这类代码生成一个统一和标准的界面。
JAXM和JAX/RPC的差别就如同面向消息的中间件(MOM)和远程过程调用(RPC)的区别。JAXM被调整用于面向消息的中间件型应用程序,而JAX/RPC被专门设计用于RPC行为。图4显示了JAX/RPC和JAXM。
图 4 在一个servlet.m中使用JAXM和JAX/RPC
注意到在JAXM和JAX/RPC能够使用之前,开发者将依赖于第三方的SOAP API,诸如Apache SOAP,IdooXOAP和GLUE。当JAXM和JAX/RPC发布后,他们应该提供一个统一的接口来实现现在各种SOAP和ebXML消息传送。这类似于JDBC如何提供一个统一的接口来访问传统数据库引擎。
到此,我们完成了对商业伙伴连接到你的服务的讨论,下面,我们将讨论瘦客户和肥客户的连接。