科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道为 Web服务创建Java客户端1

为 Web服务创建Java客户端1

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

为Web服务创建客户端的过程中用到的概念对所有语言来说都是通用的。这里的重点将放在基于WebLogic Workshop,明确讲述如何从Java客户端调用Web服务。

作者:John Methot 来源:IT专家网 2008年5月31日

关键字: 客户端 创建 web java

  • 评论
  • 分享微博
  • 分享邮件
如何为支持会话并使用了复杂类型的Web服务编写Java客户端程序。

  实现Web服务的主要前提条件是应该能够从任何其他计算机上用任一种语言编写程序来调用Web服务,只要客户端能够

  · 建立一个到Web服务主机的网络连接

  · 使用目标Web服务(通常是HTTP)支持的协议进行对话

  · 创建输出的XML消息并解释传入的XML消息

  为Web服务创建客户端的过程中用到的概念对所有语言来说都是通用的。这里的重点将放在基于WebLogic Workshop,明确讲述如何从Java客户端调用Web服务。

  BEA的WebLogic Platform提供了两种创建Web服务的方法:WebLogic Workshop和servicegen。WebLogic Workshop是为非J2EE专家准备的,它能帮助你很轻松地从头开始创建Web服务。而servicegen则是一个瞄准J2EE开发者的WebLogic Server工具,它能将现有的Enterprise Java Beans (EJB)用作Web服务。本文用到的用于说明客户端概念的Web服务示例是用WebLogic Workshop创建的,但原理是一样的,因为Web服务都遵循着一套标准。

  Web服务概念

  让我们从一个定义开始吧:Web服务是一种应用组件,要想对它进行操作可以通过合适的协议向它发送适当格式化过的XML消息。Web服务定义了操作(operation),还定义了能触发操作的消息的格式,操作正是在Web服务收到这些消息时触发的。这种格式可以是"原始的"XML,也可以是简单对象访问协议(SOAP)。SOAP规范为Web服务操作调用消息定义了特定的消息格式化规则。

  SOAP有一个细节你需要知道,因为它影响到了Web服务的互操作性。SOAP规范定义了两种对消息进行编码的方式。它们称为"document literal"(也叫"SOAP Section 5",编码正是在SOAP规范文档中的这一部分定义的)和SOAP-RPC(或者"SOAP Section 7")。document literal编码不是专门为远程过程调用准备的,它为文档定义了一种通用格式。SOAP-RPC编码则是直接瞄准了远程过程的调用。

  WebLogic Workshop Web服务默认情况下使用document literal编码方式。使用WebLogic Server的servicegen工具创建的Web服务使用SOAP-RPC。

  WSDL文件是调用Web服务的向导

  Web服务为客户端提供了一个向导,告诉客户端如何调用Web服务的操作。这个向导是在一个使用Web服务描述语言(Web Service Description Language,WSDL)格式的XML文件中提供的。如果Web服务提供者希望别人使用他的Web服务,他必须提供一个获取该Web服务的WSDL文件的方法。该文件除了描述Web服务使用的每个操作,还描述了你所发送的用于调用各个操作的消息的具体格式。WSDL还指定了该Web服务的网络地址。

  如果WSDL文件中包含了这些信息,那么客户端就有了调用Web服务的操作所需的全部信息。从概念上讲这一任务相当简单:

  1. 创建一个XML(通常是SOAP)消息。

  2. 按照Web服务期望的样式对操作参数进行编码。

  3. 向Web服务的URL发送消息。

  4. 等待响应消息

  5. 将响应消息的XML转换成可以被客户端代码理解的数据类型。

  从理论上说,这很简单,但实际上如果没有其他方面的帮助这将很复杂。这意味着为了编写出Web服务客户端,你需要:

  l 能在Web服务操作所需的任意复杂的Java类型和具体的XML或者SOAP编码方式这两者之间进行转换的代码,以及

  l 使用Web服务可以理解的协议(像HTTP)来建立网络连接的代码。

  第一种代码如果通用性足够好,能处理任意复杂的组合数据类型,那么将尤为复杂。

JAX-RPC和客户端JAR文件

  幸运的是,有一种Java API,它提供了所有你所需要的支持,它就是Java API for XML-based RPC (JAX-RPC)。JAX-RPC可用来基于Web服务的WSDL文件为该Web服务实现一个客户端。更幸运的是,WebLogic Server提供了clientgen工具,该工具能生成一个包含完整JAX-RPC基础的客户端JAR文件。你需要这些JAX-RPC基础来轻松调用目标Web服务的一个操作。WebLogic Workshop为你从WebLogic Workshop的测试视图中调用该clientgen工具,并为你返回一个需要和你的客户端一起使用的客户端JAR文件。每个客户端JAR文件都是针对它所创建的Web服务的。为了实现一个客户端,你不但需要客户端JAR文件,而且还需要存储在webserviceclient.jar文件中的一套通用Web服务客户端支持类。webserviceclient.jar文件在WebLogic Workshop的测试视图中也是可用的(通过Proxy Support Jar链接)。

  编写基于JAX-RPC的客户端

  既然所有概念和逻辑上的背景知识都讲清楚了,现在就可以为一个真正的Web服务创建客户端了。

  Web服务和客户端的所有代码都可以在文件RegisterClient.zip中找到。也可以找到一个主机版本的Web服务RegisterPerson.jws。要将该示例安装到WebLogic Workshop中,需要将文件解压缩到BEA_HOME/weblogic700/samples/workshop/applications/samples/proxy目录中。关于该示例的使用说明,请参考readme.html文件。

  我将用于这个演示的Web服务叫做RegisterPerson.jws,它接收一个叫做Person的记录。该记录中包含两个联系(地址)记录,一个家庭的和一个工作的。Web服务的其他操作允许查询或者更改当前的家庭或工作联系信息,或者允许查询整个Person记录。Person记录包含两个其他记录这一事实告诉你如何处理一个Web服务接口中的复杂数据类型。另外,RegisterPerson.jws是会话的。setPerson方法启动一个会话,除endSession之外的所有其他方法继续这个会话。endSession用来结束这个会话。本文稍后会解释Web服务会话的概念。

  JAX-RPC客户端都遵循同一个样式。一旦创建了一些客户端并熟悉了它们的样式,只要看一下Web服务的文档(例如,WebLogic Workshop Web服务的测试视图)就可以猜出Web服务的JAX-RPC接口了。如果没有Web服务文档的话,可以通过检查那些生成客户端JAR文件的Java文件来找出接口。下面的部分描述了基本的JAX-RPC模式。

  例示顶级代理类

  你的客户端第一个例示的是一个名为_Impl的顶级类。顶级代理类名称的开始部分应该是Web服务的名称。例如,对于RegisterPerson.jws来说,该顶级代理类的名称就是RegisterPerson_Impl.。

  在示例客户端RegisterClient.java中,顶级代理类是在第225行例示的。

  m_proxyImpl = new RegisterPerson_Impl(

  "http://localhost:7001/samples/proxy/register/RegisterPerson.jws?WSDL");

  顶级代理类的构造器参数是URL或者Web服务WSDL文件的文件系统路径。如果在Web服务URL的末端加进一个"?WSDL",那么按照Web服务工具(WebLogic Workshop,.NET,Apache)上的约定,Web服务将返回它的WSDL文件。(你可能会问,"如果Web服务不可用怎么办?",那还用说,你的Web服务客户端就不能正常工作了呗,难道不是吗?)使用URL form是个好办法,因为这允许JAX-RPC客户端代码按照Web服务的当前WSDL来验证自己。如果指定了WSDL文件的本地副本,并且由于你获得了副本Web服务也更改了它的接口,那么Web服务客户端就可能出现故障,但原因不明。通过指定WSDL的URL,可以立即发现你的客户端代码是否过时。

  获得一个协议类代理对象

  JAX-RPC包括了每个协议的协议类代理类,这些协议可以被Web服务理解(特别是对于WSDL文件中定义的各个端口类型)。代理类都被起了个名字。在示例Web服务中,只支持SOAP协议,所以代理类被称为RegisterPersonSoap。在顶级代理类中通过调用一个accessor方法,就可以得到协议类代理类。所以在我们的例子中,RegisterPerson_Impl定义了方法getRegisterPersonSoap,该方法返回一个RegisterPersonSoap代理类的例子。

  In RegisterClient.java, this happens on line 235:

  在RegisterClient.java中,这出现在第235行。

  m_proxy = m_proxyImpl.getRegisterPersonSoap();

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章