1       客户层的连接
客户层的连接是指客户如何访问你的提供网络服务的系统。表1显示了连接到网络服务三种主要的客户类型。 
表 1  客户的连接方式 
| 
 客户类型  | 
 举例  | 
 这种客户的连接方式  |  
| 
 商业伙伴(Business Partners)  | 
 赞助商(Distributors), 销售商(resellers), 大的、团体客户(large customers)  | 
 基于XML的网络服务技术 (SOAP, UDDI, WSDL, ebXML)  |  
| 
 瘦客户(Thin Clients)  | 
 浏览器、PDA、无线设备  | 
 轻量、简单协议(Lightweight protocol )如HTTP  |  
| 
 肥客户(Thick Clients)  | 
 小程序(Applets), 应用程序,现存系统  | 
 重量、复杂协议(Heavyweight protocol)如IIOP。  |    
1.1    商业伙伴的连接
商业伙伴的可以获得特殊的网络服务。商业伙伴可以使用不同的编程语言、中间件以及硬件来连接。因此,当商业伙伴访问你的系统时,网络服务请求以XML的形式出现。XML是一个标准的元-标识语言(meta-markup language)可用于商业数据和允许异构系统交互。 
1.1.1               Java Servlets
当商业伙伴发出一个网络服务请求,接收XML文档的是Java Servlets。一个Servlets是一个基于请求/应答的Java对象,它运行在可管理的容器环境下。它可以对使用任何协议(例如HTTP, FTP, or POP)的请求作出应答。在这种情况下,Servlets被用来对HTTP请求作应答,因为网络服务利用的是HTTP服务来使得跨越防火墙的通讯成为可能。 
当一个请求进入一个J2EE网络服务系统,有如图2所示的下列有序操作发生。 
- Java servlet 获得XML 文档
 
- servlet 处理获得的基于XML的请求 
 
- 然后, servlet 调用一个或多个Enterprise JavaBeans (EJB) 组件完成商业数据处理 
 
- EJB组件进行处理时可能调用外部系统的功能 
 
- EJB组件返回数据给servlet 
 
- 然后,servlet 转换返回值为XML 文档 
 
- servlet 返回XML 给客户作为应答 
  
 
图 2  处理一个商业伙伴的请求 
1.1.2               UDDI
在商业伙伴能够开始进行商业网络服务调用前,它必须先找到商业服务在哪里提供,发现了调用的接口和语义才能在他们这端开始配置软件和服务进行交互。因此,我们需要工具来发布我们的服务。 
UDDI (Universal Description, Discovery, and Integration)是很重要的一个新的工程,它用于网络服务的提供和搜索。UDDI工程提供一种叫做UBR(UDDI Business Registry)的服务,它是全局的交易和服务的公共目录。网络服务提供者能够借助UBR注册和描述他们的服务。用户能够查询UBR来发现网络服务并获得与服务互操作的信息。 
UDDI提供一个指引系统查找特定服务的描述文档的机制。UDDI包括标准“白页(white pages)”型的事物搜索和“黄页(yellow pages)”型的主题搜索,也有“绿页(green pages)”型的服务类型搜索。“绿页”型的搜索。使得开发者发现一个服务类型中的所有服务。 
UDDI利用SOAP 消息 (典型的形式是XML/HTTP)来发布、编辑、浏览和查找注册表中信息。它也包括XML schema 来封装注册表服务(registry service)发送或者返回不同类型的数据。 
1.1.3               JAXR
为了支持Java平台上的UDDI功能的实现,Java APIs for XML Registries (JAXR)是将要制订的一个开发者用来访问注册表的API规范。值得注意的是,JAXR不是现在建立网络服务必须的,你仍然可以使用更通用的XML API来直接和协议交互。JAXR是一套提供各种发布、查询和编辑注册表支持的Java API。它将主要焦点集中在B2B应用的网络服务上,并且提供复杂内容查询和发布/订阅XML消息的方法。它也能够用于访问其它类型的注册表,例如ebXML Registry (后面我们会讲到)。 
1.1.4               WSDL
为了让商家发现它想用的服务,网络服务调用的语法和语义需要在调用前理解确定。WSDL (Web Services Description Language) 规范是一个描述网络服务接口、语义和每天处理的重复工作(interface, semantics, and administrivia)的XML文档。它让简单服务能够被快速和容易的描述和归档。 
下面是个WSDL定义: 
<?xml version="1.0"?> 
<definitions name="StockQuote" 
                targetNamespace="http://example.com/stockquote.wsdl" 
                xmlns:tns="http://example.com/stockquote.wsdl" 
                xmlns:xsd1="http://example.com/stockquote.xsd" 
                xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                xmlns="http://schemas.xmlsoap.org/wsdl/"> 
<types> 
   <schema targetNamespace=http://example.com/stockquote.xsd 
                 xmlns="http://www.w3.org/2000/10/XMLSchema"> 
      <element name="TradePriceRequest"> 
        <complexType> 
           <all> 
                <element name="tickerSymbol" type="string"/> 
              </all> 
           </complexType> 
        </element> 
        <element name="TradePrice"> 
            <complexType> 
                <all> 
                   <element name="price" type="float"/> 
                 </all> 
              </complexType> 
           </element> 
        </schema> 
     </types> 
     <message name="GetLastTradePriceInput"> 
         <part name="body" element="xsd1:TradePriceRequest"/> 
     </message> 
     <message name="GetLastTradePriceOutput"> 
         <part name="body" element="xsd1:TradePrice"/> 
    </message> 
    <portType name="StockQuotePortType"> 
        <operation name="GetLastTradePrice"> 
            <input message="tns:GetLastTradePriceInput"/> 
            <output message="tns:GetLastTradePriceOutput"/> 
         </operation> 
      </portType> 
      <binding name="StockQuoteSoapBinding" 
                    type="tns:StockQuotePortType"> 
         <soap:binding style="document" 
                                 transport="http://schemas.xmlsoap.org/soap/http"/> 
        <operation name="GetLastTradePrice"> 
            <soap:operation 
                           soapAction="http://example.com/GetLastTradePrice"/> 
            <input> 
               <soap:body use="literal"/> 
            </input> 
            <output> 
                <soap:body use="literal"/> 
            </output> 
         </operation> 
      </binding> 
     <service name="StockQuoteService"> 
        <documentation>My first service</documentation> 
        <port name="StockQuotePort" binding="tns:StockQuoteBinding"> 
            <soap:address location="http://example.com/stockquote"/> 
        </port> 
     </service> 
  </definitions> 
它包括下面的关键信息: 
l         一个消息的描述/格式。它能被在<types>和 <message> 元素中传递(借助于嵌入的XML Schema 定义)。 
l         在<portType>元素中消息传送的语义。(例如:只请求,请求-应答,只应答) 
l         在<binding>元素中的特定编码(在各种诸如HTTP,HTTPS,或SMTP等特定传输协议上编码)。 
l         在<service>元素中的服务端地址(一个URL)。 
WSDL作为一种描述接口的技术接口通常和UDDI一起被提到。虽然UDDI是最常用而且是被推荐的注册WSDL规范的地方,UDDI规范并不局限于哪种格式会被链接到它的注册表。它可能是WSDL、常规的面向人可阅读的文档甚至仅仅是一个获得信息的email地址。 
在Java Community Process (JCP)中,正在进行Java API for WSDL (JWSDL)规范的制订。当它发布时,将提供API来处理WSDL文档而不是直接处理XML文档。你能全部用到JAXP的功能时,使用JWSDL更容易和快速,它可以简化开发者的工作。 
图3显示了WSDL和UDDI 
 
图 3  使用JAXR,UDDI和WSDL  
 
  |