IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  SOA and Web services  >

Web 服务(革)创新

你好世界,Web 服务风格

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Graham Glass (graham-glass@mindspring.com), CEO 兼首席设计师, The Mind Electric

2000 年 12 月 01 日

本文循序渐进地解释如何开发 Web 服务,包括需要什么工具、如何安装这些工具、如何编写代码以及如何部署服务。它还继续解释如何从因特网调用其它 Web 服务。

欢迎阅读本专栏第二部分,本专栏重点讲述 Web 服务技术的演变和革新方面。在 第一部分 中,我给出了 Web 服务的概述和使该技术成为主流所必须解决的问题。在本文中,我将为您讲解构建和部署第一个 Web 服务所需知道的所有事情。我还将演示如何调用已部署在因特网上的 Web 服务。

工具和安装

构建第一个 Web 服务的第一步是选择一个工具集。将使用的工具有:

  • Apache SOAP 2.0 - SOAP 的这个开放源码 Java 实现包括对 SOAP 1.1 规范有用的子集的支持,并与现有的 Web 服务很好地集成。请参阅 参考资料一节以下载该软件。
  • Apache Jakarta Tomcat 3.2.1 - 该开放源码 Java Web 服务器还实现了主机 Apache SOAP 2.0 所需的 Java servlets 2.2 API 规范。请参阅 参考资料一节以下载该软件。
  • Apache Xerces XML Parser 1.2.3 - 该开放源码 XML 语法分析器实现大多数最新 XML 规范,并由 Apache SOAP 2.0 使用。请参阅 参考资料一节以下载该软件。

希望您的下载链路速度足够快,因为这些下载总量超过 6 兆字节。我在家里通过 28K 链路下载该软件,下载时间足够我喝几杯咖啡和出外跑步了。

如果将每个包解压缩到根目录,应该得到如 清单 1所示的目录结构。


清单 1:Apache 包目录清单
 \
 \jakarta-tomcat-3.2
 \lib - contains webserver.jar, servlet.jar, jasper.jar, parser.jar, jaxp.jar
 \soap-2_0
 \lib - contains soap.jar
 \xerces-1_2_3 - contains xerces.jar

接下来要做的是将 Xerces 和 Apache SOAP .jar 文件添加到类路径, 确保 xerces.jar 在前面。 如果不这样做,则 Apache SOAP 可能会发现错误的 XML .jar 文件,从而无法正确工作。我在自己的系统上将以下两项添加到类路径中:

C:\xerces-1_2_3\xerces.jar
 C:\soap-2_0\lib\soap.jar

然后将 tomcat bin 子目录添加到 PATH 设置,并将环境变量 TOMCAT_HOME 设置成 tomcat 主目录。如果将 tomcat 安装到根目录,则要把 C:\jakarta-tomcat-3.2\bin 添加到 PATH,并将 TOMCAT_HOME 设置成 C:\jakarta-tomcat-3.2

下一部分有点麻烦。很明显,主 Tomcat 脚本错误地将自己的类插入到现有类路径之前,从而导致前面提到的顺序错误的 xerces.jar 问题,因此,必须编辑 \jakarta-tomcat-3.2\bin\tomcat.bat (如果正在使用 UNIX,则编辑 .sh),并将下行:

set CP=%CP%;%CLASSPATH%

替换成:

set CP=%CLASSPATH%;%CP%

或其 UNIX 等价行。通过交换顺序, xerces.jar 文件现在又处于正确的搜索位置。

最后,必须通过编辑 \jakarta-tomcat-3.2\conf\server.xml 并在文件中现有项之后附加 清单 2 中的 <Context> 项来配置 Tomcat,以便它自动检测 Apache SOAP 子系统。


清单 2:插入到 server.xml 的 <Content> 项
<Context
   path="/soap"
   docBase="C:/soap-2_0/webapps/soap"
   reloadable="true">
 </Context>

docBase 属性设置成指向 Apache SOAP webapps/soap 子目录的完整路径。如果正在使用 Windows,则必须包括驱动器字母,否则将不会正确工作(我好不容易才得知这一点)。

现在您已准备好开始构建第一个 Web 服务应用。





回页首


启动 Web 服务器

在为您演示如何编写自己的 Web 服务之前,让我们启动 Tomcat 并激活 SOAP 欢迎页面。创建一个名为 \demo1 的目录来放置示例应用,转至该目录,然后输入:

 tomcat run

这将启动在本地主机端口 8080 上运行的 Tomcat Web 服务器。应该看到如 图 1的屏幕。


图 1:引导 Tomcat Web 服务器
性能图像

然后启动 Web 浏览器并输入 URL http://localhost:8080/soap 。这将激活在编辑 Tomcat server.xml 文件时安装到 /soap 的 Apache SOAP。如果这些都正确,您将看到如 图 2 中打开的页面。


图 2:Apache SOAP 系统的欢迎页面
Apache SOAP 欢迎页面

这时,关闭浏览器并停止 Tomcat。将在编写了 Web 服务并准备部署之后再次重新启动它们。





回页首


编写 Web 服务

编写 Web 服务比较简单。我将编写一个简单的 Web 服务来计算两个国家之间的汇率。该服务的 Java 界面如 清单 3所示。


清单 3:简单 Web 服务的 Java 界面
public interface IExchange 
   { 
   float getRate( String country1, String country2 ); 
   }

Apache SOAP 不要求实际声明接口,可以直接从实现类发布方法,但是我更喜欢用这种方法作为良好编程习惯的一部分。 清单 4显示了将用到的简单接口实现。


清单 4:示例的 Java 接口
public class Exchange implements IExchange
 {
 public float getRate( String country1, String country2 )
 {
 System.out.println( "getRate( " + country1 + ", " + country2 + " )" );
 return 144.52F; // always return the same value for now
 }
 }

\demo1 添加到类路径,然后编译代码以创建 \demo1\Exchange.class 。一旦完成后,可以将该 Java 类作为 Web 服务发布到 Tomcat。





回页首


部署 Web 服务

要部署 Exchange 服务,通过输入 tomcat run 再次从 \demo1 目录启动 Tomcat。然后在浏览器中输入 URL http://localhost:8080/soap ,然后在看到欢迎屏幕时单击 Run the adminclient。应该看到如 图 3 的屏幕。


图 3:SOAP Admin 页面
Soap 管理页面

该屏幕显示一些允许您部署、取消部署和列出 Tomcat/SOAP 系统中驻有服务的选项。如果单击 List 选项,将看到没有要开始的服务。要部署 Exchange 服务,单击 Deploy选项并如 图 4所示填充字段。


图 4:部署 Exchange 服务
部署 Exchange 服务

以下是 Deploy 屏幕中每个字段的解释:

  • ID :Web 服务标识。在该示例中,我将服务标识设置成 urn:demo1:exchange ,它跟在 http://www.ietf.org/rfc/rfc2141.txt 推荐的统一资源命名规范之后,其中,demo 是名称空间,exchange 是服务字符串。
  • Scope:服务的激活方式。 Request 表示每一个请求都创建一个新的服务实例。其它可用的方式是 SessionApplication
  • Methods :要在 Web 服务中显示的由空格定界的方法列表。请注意,这好象暗示 Web 服务无法显示两个同名方法,但 SOAP 规范并不禁止这样做。
  • Provider :Web 服务的类型。Apache/SOAP 目前只支持 Java 类和 Bean 脚本,但以后的版本将肯定支持 EJB 和其它流行的组件类型。
  • Provider Class/Static :Java 类的名称。必须通过类路径设置获得该类。如果 Static 为真,则假定方法为 Java 类上的静态方法,否则将它们作为实例方法处理。

其它字段与 Apache/SOAP 平台的专有加载项 (add-on) 相关,本文不再赘述。

输入这些字段之后,向下滚动并单击窗口底部的 Deploy 按钮。应该看到一个屏幕表明已经部署了服务。如果单击 List 按钮,则将看到列出的 Web 服务的 URN。单击其链接,应该看到如 图 5的信息。


图 5:列出 Web 服务的 URN
列出 URN

如您所见,部署过程非常简单明了。有关当前部署的服务的所有信息都被 Tomcat/SOAP 存储到当前目录中名为 DeployedServices.ds 的文件中。请耐心尝试并阅读它 -- 它包含一个序列化的 Java 散列表!





回页首


调用 Web 服务

要从 Java 客户机调用 Web 服务,需导入 Apache/SOAP 所需的各种包,然后通过构造 Call 对象并初始化其字段来准备远程 SOAP 调用。通常将编码风格设置成 Constants.NS_URI_SOAP_ENC ,本文不再赘述替代的编码风格。

每个参数都由一个 Parameter 对象和自变量名称、自变量类型、自变量值(带有封装在其 Object 等价物中的原语)和自变量的编码风格(空表示缺省)表示。

要发送方法调用,用 SOAP 端点的 URL 和 SOAPAction 值(通常是空字符串,将在下一专栏中讨论)执行 invoke() 方法。如果一切正常,则返回结果和封装在其对象等价物中的原语。 清单 5显示了 Java 客户机的源代码。


清单 5:Java 客户机代码
import java.net.*; 
 import java.util.*; 
 import org.apache.soap.*; // Body, Envelope, Fault, Header
 import org.apache.soap.rpc.*; // Call, Parameter, Response
 public class Client 
   { 
   public static void main( String[] args ) throws Exception 
     { 
     URL url = new URL( "http://localhost:8080/soap/servlet/rpcrouter" ); 
     String urn = "urn:demo1:exchange";
     Call call = new Call(); // prepare the service invocation 
     call.setTargetObjectURI( urn );
     call.setMethodName( "getRate" ); 
     call.setEncodingStyleURI( Constants.NS_URI_SOAP_ENC );
     Vector params = new Vector();
     params.addElement( new Parameter("country1", String.class, "USA", null ) );
     params.addElement( new Parameter( "country2", String.class, "japan", null ) );
     call.setParams( params );
     try 
       { 
       System.out.println( "invoke service\n" + "  URL= " + url + "\n  URN =" + urn );
       Response response = call.invoke( url, "" ); // invoke the service
       if( !response.generatedFault() ) 
         { 
         Parameter result = response.getReturnValue(); // response was OK 
         System.out.println( "Result= " + result.getValue() );
         } 
       else 
         { 
         Fault f = response.getFault(); // an error occurred 
         System.err.println( "Fault= " + f.getFaultCode() + ", " + f.getFaultString() );
         } 
       } 
     catch( SOAPException e ) // call could not be sent properly 
       { 
       System.err.println( "SOAPException= " + e.getFaultCode() + ", " + e.getMessage() );
       } 
     } 
   } 

当通过输入 java Client 运行程序时,应该看到如 图 6的结果。


图 6:运行 Java 客户机
运行 Java 客户机

最后,Tomcat 屏幕中应该出现 Web 服务的输出,如 图 7所示。


图 7:Tomcat 上的 Web 服务输出
Web 服务输出

恭喜!您刚刚构建并运行了第一个 Web 服务应用。现在开始真正享受乐趣吧!





回页首


从因特网调用 Web 服务

因为 Web 服务通过 HTTP 使用标准的 XML 格式来进行消息传递,所以从因特网调用 Web 服务相当明了。要演示这点,请造访 XMethods 站点(请参阅 参考资料 )。该站点有体验这种新技术的极好的 Web 服务选择。其主页显示了可用 Web 服务的列表,如 图 8所示。


图 8:XMethods 的 Web 服务清单
XMethods 的 Web 服务清单

从该索引单击名为 Currency Exchange Rate 的 Web 服务。将显示一个屏幕(请参阅 图 9 ),该屏幕描述这个 Web 服务的所有细节,包括 URN、路由器端点 URL 和开发人员可用方法的每一个描述。


图 9:有关 Xmethods 上 Currency Exchange Rate 的信息
XMethods 上的 Currency Exchange Rate 服务

我们将在本专栏的下一部分更详细地讨论 Web 服务。目前,姑且认为在 XMethods 发布的 Web 服务提供与您刚刚构建的方法完全相同的方法。要调用 XMethods 服务,将 Java 客户机中的 URL 和 URN 设置分别修改成 http://services.xmethods.net/soapurn:xmethods-CurrentExchange ,然后重新运行客户机。应该看到如 图 10的屏幕。


图 10:运行 Currency Exchange Rate Web 服务
运行 Currency Exchange Rate Web 服务

我第一次运行这种代码的感觉是:通过因特网得到方法调用并调用远在千里之外的服务真是太奇妙了!

在本专栏的下一部分中,我将解释 SOAP 的内部工作,包括 XML 的线上格式、编码方案以及它如何与 Web 服务器集成。



参考资料



关于作者

Graham Glass 是 The Mind Electric 的创始人、CEO 兼首席设计师,该公司设计、构建和特许向前思考型分步式计算基础设施。他相信,因特网的演变将反映出生物思维的演变,协助人们和企业有效联网的体系结构能帮助人们理解将人脑联结在一起的体系结构。可通过 graham-glass@mindspring.com 与他联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款