基于SOAP协议的WEB服务研究

摘 要(Abstract)     Web 服务是局域网和因特网上能够支持机器与机器之间互操作的软件系统。它有一个用WSDL描述的接口,其它系统可以使用SOAP消息以接口所描述的方式与之交互。SOAP协议是Web服务赖以生存的基础。本文详细介绍了SOAP协议,并介绍了Java Web服务的一种标准结构。然后介绍了基于SOAP协议的 WEB服务的一个具体实现过程。最后介绍了Web服务的未来发展。
A Web Service is a software system designed to support interoperable machine-to-machine interaction over Intranet and Internet. It has an interface described in WSDL. Other systems interact with the Web Service in a manner prescribed by its description using SOAP-messages.Web Service depends on SOAP.This paper elaborates on SOAP,and it also introduces a standard structure of Java Web service.Then it uses an example to illustrate how to establish a simple SOAP based Web Service.Finally it introduces the development of Web Service in the future.
关键词(Keywords)      WEB服务   SOAP   Java
Web Service       SOAP       Java

1  引言
1.1 Web服务的定义及特性
    近年来,随着企业内部、企业与企业之间各种应用系统互相通信和互操作性需求的增长,Web Service得到了飞速的发展。Web服务的目标是实现这样的分布式环境:在此环境中各个组织内部及各组织之间任意数量的应用程序或应用程序组件能够以与平台无关和语言无关的方式无缝交互。
按W3C组织的定义,Web服务是通过统一资源标识URI(Uniform Resource Identifiers)标识的软件系统,它的共用接口和绑定用XML来定义和描述。Web Service的定义能够被其它的软件系统发现,这些系统然后可以通过Internet协议传递基于XML的消息,这样就可以用Web Service 所定义的方式与其交互。

    Web服务使我们能够对因特网或网络上的一个对象进行远程调用RPC(Remote Procedure Call)。Web服务使用中性平台标准(例如HTTP和XML),这使我们可以对客户完全隐藏执行任务的细节,客户只需要知道这个服务的URL或方法调用使用的数据类型,而不需要知道该任务到底是一个在Linux上运行的还是一个在Windows上运行的用Java编程的ASP.NET服务。

1.2 Web服务核心技术
    Web服务是若干技术的集合,其中SOAP、WSDL、和UDDI是其技术体系的核心。WSDL是Web服务的描述语言,它类似于CORBA的IDL用以描述Web服务的交互消息格式、端口类型以及传输协议的绑定。Web服务使用UDDI作为目录机制,服务发布者可以将服务信息注册到UDDI,从而方便服务使用者进行服务查找。SOAP提供一个标准的包装结构用以在多种标准Internet技术上(包括SMTP、HTTP和FTP)传输XML文档。它还定义了用XML传送非XML RPC调用的编码和绑定标准,SOAP为RPC提供了一个简单的结构:文档交换。采用标准传输机制后,异构的客户和服务器能一下子可互操作。.NET用户能调用SOAP暴露的EJB,Java客户能够调用暴露的.NET组件。

2  SOAP技术
2.1 SOAP的定义及特性
    SOAP(Simple Object Access Protocol)即简单对象访问协议,它是一个轻型分布式计算协议,允许在一个分散、分布的环境交换结构化的信息。SOAP规范定义了在分布式系统中传送消息的框架和支持远程过程调用和响应的惯例。但是,SOAP并没有详细说明语义,只是提供框架。

    SOAP并不是第一个分布式计算协议,但它是第一个受到业界前所未有的支持,对它的支持来自所有主要的软、硬件销售商,IBM、Microsoft以及Sun公司等都支持它。这种情况对于其它分布式计算协议(例如:CORBA、RMI和DCOM)从未发生过。
SOAP的部分特性如下:
(1) 高度互操作性
SOAP是用基于文本的XML协议与分布式系统通信,而不是用其它分布式计算协议(例如CORBA、RMI和DCOM)使用二进制格式。这使得SOAP具有跨硬件平台、操作系统、编程语言和网络硬件平台的高度互操作性。
(2) SOAP并没有排除与其它Internet协议的绑定
虽然SOAP规范1.2中只定义了与SOAP与HTTP的绑定,但SOAP并没有排除与其它Internet协议(例如SMTP和FTP等)绑定。
(3) 扩展容易
SOAP很容易通过XML扩展,使得它于企业级特性(例如交易、安全性等)相结合。

2.2 SOAP消息
    下面是一个用SOAP消息表示的网上定购从武汉到上海飞机票的例子:
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
<env:Header>
<m:reservation xmlns:m=http://travelcompany.example.org/reservation
env:role=http://www.w3.org/2003/05/soap-envelope/role/next
  env:mustUnderstand="true">
<m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference
<m:dateAndTime>2003-10-29T13:20:00.000-05:00</m:dateAndTime>
</m:reservation>
<n:passenger xmlns:n=http://mycompany.example.com/employees
env:role=http://www.w3.org/2003/05/soap-envelope/role/next
  env:mustUnderstand="true">
  <n:name>Tom</n:name>
</n:passenger>
</env:Header>
<env:Body>
    xmlns:p="http://travelcompany.example.org/reservation/travel ">
     <p:departure>
     <p:departing>Wuhan</p:departing>
     <p:arriving>Shanghai</p:arriving>
    <p:departureDate>2003-11-1</p:departureDate>
   <p:departureTime>late afternoon</p:departureTime>
     <p:seatPreference>aisle</p:seatPreference>
     </p:departure>
</env:Body>
</env:Envelope>
    从上例中可以看到SOAP消息是以SOAP Envelope为根元素,内含2个子元素:SOAP Header和SOAP Body。这2个子元素的内容是由应用定义的,而不由SOAP规范所决定。

    SOAP Header是可选的,也可以没有。SOAP Header在SOAP消息中提供了一种传递信息的途径,但它传递的信息不是应用程序的有效载荷。这些信息可以是与要处理的消息相关联的信息或指示,可以由SOAP消息传递路径中的中间节点处理。本例中,SOAP头中的reservation块提供了订票的序号和时间标志,passenger块提供订票人的身份。由于这两个块的mustUnderstand属性都为真,所以它们必须被处理。

    SOAP Body是强制性的,是SOAP消息必须要有的元素,它包含了SOAP消息的主要内容,由最终接收SOAP消息的节点处理。SOAP Body是应用的有效载荷,可以包含应用数据、RPC方法和参数以及SOAP错误。本例中它只含有一个子元素:departure。它包含了最终接收 SOAP消息的节点要处理的信息。

2.3 SOAP消息处理模式
    SOAP提供一个分散的处理模式,假定SOAP消息从消息的初始发送者到最终接收者之间要通过许多SOAP中节点或不通过中节点。SOAP消息处理模式描述了SOAP节点在收到消息时采取的行为。SOAP节点根据“role”属性、“mustUnderstand”属性以及“relay”来决定相应的动作。

    SOAP节点对SOAP消息的进一步处理依赖于“role”属性。在处理SOAP消息时,一个SOAP节点可以扮演一个或更多的角色(role),三种标准的角色定义如下:
·http://www.w3.org/2003/05/soap-envelope/role/none (简称“none”)
·http://www.w3.org/2003/05/soap-envelope/role/next (简称“next”)
·http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver (简称“ultimateReceiver”)
表1总结了在不同的节点情况可适用的标准角色:
表1  不同的SOAP节点可适用的标准角色
 
    为了保证SOAP节点不会忽略对应用很重要的SOAP头块(SOAP header blocks),SOAP头块提供了额外可选的属性:“mustUnderstand”,如果该属性为真的话,意味着目标SOAP节点必须按那个块的说明处理块。表2总结了对于SOAP头块的处理行为:
表2    mustUnderstand属性与节点的处理行为


    SOAP版本1.2为SOAP消息头块定义了另外一个可选属性:“relay”属性。注意到如果一个SOAP头块被处理了,按照SOAP消息的处理规则,它必须从SOAP消息中删除。对于没有被处理的块,缺省的行为是在消息传递之前删除它。这主要是因为安全方面考虑,但是有时候,当应用的设计者引入一个通过SOAP消息头块展示的新特性,任何SOAP消息传递路径上的中间节点可能都要遇到这个块,这样一个块可能为那些可以理解它的中节点所利用,与此相反,另外一些中节点却忽略它并传递它。当一个SOAP头块的“relay”属性为“true”时,容许不处理它的中节点传递它,使别的中间节点有机会处理它。

2.4 SOAP绑定
    SOAP消息可以通过多种协议在应用之间交换。使用一个协议在SOAP节点间传递SOAP消息的规范就是SOAP绑定。一个绑定规范描述了它所提供的特性,有些特性是自然由SOAP所绑定的协议提供的,不能由绑定协议提供的特性通过使用SOAP头在SOAP信封内实现。

    HTTP是一个著名的连接模型和信息交换模式。有两种方式传递SOAP消息:1、用HTTP POST方法。2、用HTTP GET方法。

    在HTTP上的SOAP请求与SOAP响应非常类似,一般是一个HTTP头在加上一个SOAP消息。下面是一个SOAP HTTP请求的例子:
POST /Reservations HTTP/1.1
Host: travelcompany.example.org
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
         ……
</env:Envelope>
SOAP还可以与EMAIL绑定,SOAP EMAIL消息由一个EMAIL头,加上一个SOAP消息组成,下面是一个下SOAP EMAIL请求的例子:
From: tom@mycompany.example.com
To: reservations@travelcompany.example.org
Subject: Travel to LA
Date: Thu, 30 Oct 2003 13:20:00
<m:dateAndTime>2003-10-30T13:20:00.000-05:00</m:dateAndTime>
Content-Type: application/soap+xml
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
         ……
</env:Envelope>
3  SOAP服务的标准结构
    WEB服务的架构主要有Sun公司的J2EE和Microsoft的.NET,两种平台各有各的优点,从目前来看,J2EE更成熟。J2EE基于Java技术的,图1是Java中SOAP服务的标准结构:


图1    Java中SOAP标准结构


    一个客户机应用程序用SOAP在HTTP上的远程过程调用请求,SOAP运行时间(例如Apache SOAP)环境收到这个RPC请求后立刻把该请求传递给含有该请求方法的那个Java对象。在这个结构中,Java对象可以访问本地的或远程的资源。

4  SOAP服务实例
    介绍一个采用SOAP技术的工作简历档案服务,允许人们提交和检索简历。

4.1 运行环境
    需要Apache SOAP服务器,它提供了一个服务器端的构件用来部署、管理和运行基于SOAP服务,还提供了客户端的API来调用SOAP服务。还需要Apache Tomcat 4.0服务器,以及以下文件:xerces.jar(XML语法分析)、mail.jar(邮件处理API)、 activation.jar(Javabeans激活框架)。这些文件在Sun和Apache的网站上可以免费下载。它们和SOAP.jar应该放在 Tomcat服务器的lib路径下,并把SOAP.war放到Tomcat服务器的Webapps目录下。

4.2 开发SOAP服务
    服务实现类—实现一个服务的标准Java类。当Apache SOAP运行时间从SOAP客户机收到服务请求时,标准Java提供者就会调用这种类。

    我们的实现类为JobResumeService,含有submit(Resume resume)和retrieve(string uid)方法,实现分别存储和检索简历的功能。此外,还需要一个Resume类,用以在Apache SOAP客户机和Apache SOAP服务器之间交换简历数据。Resume数据是用户自定义类型,需要用Apache SOAP运行时间注册新的类型映射。由于编写的Resume类符合JavaBean规范,org.opache.encoding.soapenc.BeanSerializer类就可以处理这个类的串行化。uid是简历的编号。

4.3 开发SOAP客户机
    用户用一个HTML表单输入简历,表单含有多个输入简历信息的字段。把表单填好并提交后,就由一个叫做SubmitServlet的服务小程序进行处理。SubmitServlet程序中调用SOAP服务的代码如下:
    Call call = new Call();
    call.setSOAPMappingRegistry(smr);
    call.setTargetObjectURI("urn:JobResumeService");
    call.setMethodName("submit");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector params = new Vector();
params.addElement(new Parameter("resume", Resume.class,resume,null));
call.setParams(params);//指定参数
Response resp = null;
try {    URL url = new URL(RPCROUTER);
         resp = call.invoke(url, "");}
catch (SOAPException e){…}

    设置SOAP请求用org.apache.soap.rpc.call对象来完成,上面代码中用setSOAPMappingRegistry()方法设置对SOAPMappingRegistry对象的引用,所以CALL对象知道将要发送和接收的类型是什么。如果只是使用预定义的那些类型就不用调用这个方法。不过因为在例子中用的是用户定义的类型(Resume),所以必须调用该方法。用setTargetObjectURI()方法指定服务名,在该例子中的服务名是urn:JobResumeService;用setMethodName()方法指定想执行的方法名submit;用 setEncodingStyleURI()方法指定在SOAP消息编码时应当使用的编码方式;由于submit()需要一个参数,参数必须加到CALL 对象调用请求;最后用invoke()方法把SOAP请求送到SOAP服务器。

    客户端对简历的查询使用RetrieveServlet服务小程序来实现,它的SOAP调用与SubmitServlet类似。

4.4 部署运行服务
    首先要部署我们的JobResumeService类,部署描述文件JobResumeDD.xml描述了JobResumeService类的编码类型和方法。可以用两种方式部署服务:
(1) 用命令行部署
java org.apache.soap.server.ServiceManagerClient  http://localhost:8080/soap/
servlet/rpcrouter deploy JobResumeDD.xml
(2) 服务的注册
用基于Web的工具,把浏览器指向http://localhost:8080/soap/admin ,单击deploy按钮,按规范填写表单,即可完成服务的注册。
(3) 运行服务
先启动Tomcat服务器,把浏览器指向http://localhost:8080/jobresume 就可以提交和查询简历。

5  结束语 
    基于SOAP的Web服务通过Internet协议和XML格式的SOAP来实现网络服务的访问,具有跨平台、跨语言的优点。但是没有任何技术可以解决一切问题,SOAP技术也不例外,它不会取代其它分布式计算技术(例如RMI、CORBA及DCOM)。当前,Web服务的若干技术SOAP、WSDL以及 UDDI都在不断发展和完善中,基于SOAP的Web服务技术必将在应用系统整合方面发挥越来越重要的作用。

参考文献
[1] 卢 刚,高春蓉. Java Web服务编程指南[M]. 北京:电子工业出版社,2002.
[2] 魏海洋,于晓菲. Java SOAP编程指南[M]. 北京:电子工业出版社,2002.
[3] 毛世杰,刘绍华. Java Web服务[M]. 北京:中国电力出版社,2003.
[4] W3C. SOAP Version 1.2 Part 0: Primer. http://www.w3.org/TR/2003/REC-soap12-part0-20030624 . June 2003.
[5] W3C. Web Services Architecture. http://www.w3.org/TR/ws-arch/ . August 2003.

作者简介
谭思云(1963-)  男  武汉理工大学自动化学院副教授 主要研究方向:计算机系统集成及故障诊断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值