基于Java语言的Web服务的动态发现与调用研究

时间:2022-06-16 04:28:40

基于Java语言的Web服务的动态发现与调用研究

摘 要:Web服务是一个崭新的分布式计算模型,它的研究重点是Web服务的新型构架,Web服务的高效执行方式,Web服务与其他成熟技术的有机结合以及Web服务的集成是解决现实应用问题的重要技术。为了充分发挥 Web 服务的灵活性,用户必须能够动态地发现和调用 Web 服务。动态发现Web服务的研究目标是服务发现的高效率和自动化。在此使用Java的开放源码包uddi4j,wsdl4j和Apache Axis 2来实现Web服务的动态发现与调用的方法。该方法实现了Web服务与Java技术的有机结合,为更高效率的应用Web服务提供一种思路。

关键词:分布式计算模型; Web服务;Java; UDDI

中图分类号:TN911; TP273 文献标识码:A

文章编号:1004-373X(2010)14-0086-03

Dynamic Discovery and Invocation of Web Service Based on Java Technology

SU Jin-zhi,LI Zhi-wu

(Vocational and Technological College, Liaoning Shihua University, Fushun 113001, China)

Abstract:Web service is a new distributed computing model, and it is also an effective mechanism for the data and service integration on the web. Thus, web service has become a solution to E-business. It is important and necessary to carry out the research on the new architecture of web service in combination with other good techniques and on the integration of services. The Web services must be dynamically discovered and invoked in order to give full play to its flexibility, whose research aim is high efficient and automation. According to the Web Service model framework, the method of dynamic discovery and invocation of Web service using the open source packages uddi4j, wsdl4j, and Apache Axis based on Java technologies is introduced. The method, which puts Web service together with Java technologies can effectively make use of Web Service.

Keywords:distributed computing model; Web service; Java; UDDI

0 引 言

Web服务(Web Service)是一种用于应用程序集成的新技术,它并不追求代码的可移植性,而是要使分布在互联网中的各种系统实现交互[1]。它是下一代互联网分布式计算的基本组成单元。Web Service提供者通过Web服务描述语言(web services description language,WSDL)的规范Web服务。服务请求者利用UDDI(universal description discovery and integration)协议在服务注册中心注册,在服务中查找所需的服务,根据返回信息的Web服务WSDL描述文件找到服务提供地址,按照服务提供者要求的规范与之绑定,采用SOAP通信使用服务提供者的服务。

Web Service的体系构架是基于服务提供者、服务注册中心和服务请求者3个角色和发现、、绑定3个动作组成的[2]。是为了让用户或其他服务知道某个Web Service的存在以及相关信息,发现是为了找到合适的Web Service,绑定则是在提供者和使用者之间建立某种联系。

1 Web服务的动态发现与调用

对于Web Service而言,其典型的体系构架应当如图1所示[3]。从图中可以看到,所谓Web服务发现,就是客户以某种方式在不同类型的Web服务中找到其想要的服务,以执行Web服务请求。Web服务发现是Web服务系统架构中的一个重要部分,UDDI是其中┮恢知解决方案。为了充分发挥 Web 服务的灵活性,用户必须能够动态地发现和调用 Web 服务,Web服务发现的研究目标是服务发现的高效率和自动化[4-5]。本文利用Java语言实现了Web服务的动态发现和调用方法。

Web服务发现的具体流程如下:

(1) 服务提供者将服务描述信息到UDDI上,以供检索;

(2) 服务请求者发现来自 UDDI 的关于此服务的信息;

(3) 阅读来自服务提供者的 WSDL 实现文件并进行解析,以获取各种信息;

(4) 用 Apache Axis编码动态请求Web服务。

图1 Web服务架构

假定Web服务已经被到UDDI并等待客户机请求。在客户机代码中,Web服务的动态发现与调用通过使用Java的开放源码包uddi4j,wsdl4j和Apache Axis 2来实现。其中uddi4j是Java类库,它可以提供用来与UDDI注册表交互的API。该类库生成发送到UDDI服务器和从UDDI服务器接收的消息,并对其语法进行分析;wsdl4j是一个解析和创建WSDL的Java类库;Apache Axis的主要功能是作为一个 SOAP的实现来让开发者通过它来构建自己的Web Service [6]。由于uddi4j能提供一个使用户能够查询和到任何 UDDI 2.0 注册中心的 API,所以用uddi4j来浏览UDDI注册中心。wsdl4j包用于以编程方式表示WSDL文件的元素,这样就可以浏览和收集来自该文件的各种信息。然后用Axis向服务器发出真正的Apache SOAP请求并等待应答。

2 Web服务的动态发现与调用的实现

2.1 在UDDI中查找Web服务

为了动态地调用Web服务,首先应知道UDDI注册中心的查询URL,UDDI的URL、业务实体的名称以及业务服务的名称;然后使用UDDI注册中心的查询URL 创建到UDDI注册中心的;最后用这个对注册中心进行查询以查找所需的Web服务[7]。具体实现过程为:

private String uddiURL= "localhost:80/uddisoap/urlapi";

private String uddiPubURL = "localhost:80/uddisoap/pubapi";

private String businessName = "lnpu";

private String serviceName = "newspub";

public String findImplURI() {

try {

UDDIProxy proxy=new UDDIProxy(

new URL(uddiURL), new URL(uddiPubURL));

Vector names = new Vector();

names.add(new Name(businessName));

BusinessList businessList= proxy.find_business(names, null, null, null, null, null,10);

Vector businessInfoVector= businessList.getBusinessInfos().getBusinessInfoVector();

BusinessInfo businessInfo = null;

for (int i = 0; i < businessInfoVector.size(); i++) {

businessInfo = (BusinessInfo)businessInfoVector.elementAt(i);

if(businessName.equals(

businessInfo.getNameString())) {

break;

} }

Vector serviceInfoVector=businessInfo.getServiceInfos().getServiceInfoVector();

ServiceInfo serviceInfo = null;

for (int i = 0; i < serviceInfoVector.size(); i++) {

serviceInfo = (ServiceInfo)serviceInfoVector.elementAt(i);

if(serviceName.equals(serviceInfo.getNameString())) {

break;

} }

ServiceDetail serviceDetail= proxy.get_serviceDetail(serviceInfo.getServiceKey());

Vector businessServices = serviceDetail.getBusinessServiceVector();

BusinessService businessService = null;

for (int i = 0; i < businessServices.size(); i++) {

businessService = (BusinessService)businessServices.elementAt(i);if(serviceName.equals(

businessService.getDefaultNameString())) {

break;

} }

一旦查到了Web服务,就可以收集服务提供者机器上的WSDL实现的URI。这将由UDDI注册中心中的tModle的Overview URL元素表示。要查找这个元素,必须先找到业务服务的绑定模板,它包含一个基于HTTP的访问点。一旦找到了这个模板,那么就可以找到由绑定的模板引用的适当tModel。然后,用绑定模板反复进行对tModel的所有引用,在找到第一个Overview URL(即 WSDL 实现的位置)时停止。既然知道WSDL实现的URL,就可以继续用 wsdl4j直接请求来自服务提供者的文档并对其进行解析,从而获得为了调用服务所需要传送给Axis的参数。

2.2 解析WSDL

在2.1节中得到了用于Web服务WSDL实现的URL,就可以用 wsdl4j 来解析它。为了使用 Axis 调用该服务,需要从WSDL收集下列信息:目标名称空间、服务名称、端口名称、操作名称和操作输入参数。为了收集这些信息,首先需获取表示WSDL实现和WSDL接口的Definition 对象;接着,通过搜索实现WSDL中定义的所有imports,获取另一个Definition对象,它表示 WSDL接口;然后,查找要被传送给Axis的目标名称空间;最后,查找包含了想要调用的操作的端口。收集到了调用服务所需的所有信息即可以用┮桓霆Axis 调用来调用Web服务。

2.3 用Axis调用Web服务

Axis不提供从一个完整的名称空间创建QName 的构造程序,所以必须把端口名称分割成名称空间和本地部件[8-9]。创建一个Service对象(它提供WSDL实现的URL)和QName(它表示端口名称)。 然后再创建另一个表示服务名称的QName对象。从Service对象创建Call对象,通过传入Call对象要调用的端口QName和操作名称来设置其将调用的操作。最后,调用在解析 WSDL时创建的传入Object[]参数中的操作。

3 结 语

Web服务的提供者日益增多,服务请求者如何选择最适合自己的服务成为了一个难题。詹姆斯•戈士林博士曾说过[10]:“Java技术与Web服务之间没有界限”。本文使用Java语言实现了Web服务的动态发现 和调用,为更好地应用Web服务提供一种思路。

参考文献

[1]FERRRACCHIA Fabio Claudio. .NET 数据服务[M].毛尧飞,译.北京:清华大学出版社,2005.

[2]BARWELL Fred, BLAIR 高级编程[M].张加荣,译.北京:清华大学出版社,2005.

[3]刘必欣.动态Web服务组合关键技术研究[D].长沙:国防科学技术大学,2005.

[4]岳昆,王晓玲,周傲英.Web服务核心支撑技术研究综述[J].软件学报,2004,15(3):428-442.

[5]ONION 基础教程[M].北京:清华大学出版社,2003.

[6]毛枝年,强俊,程双军.基于Web的信息检索系统的设计与研究[J].计算机工程与设计,2006(6):1025-1027.

[7]COYLE F P. XML, Web服务和数据革命[M].北京:清华大学出版社,2003.

[8]BALLINGER Web Services架构与实现[M].张晓坤,译.北京:中国电力出版社,2004.

[9]RIEHTER Jeffrey. Microsoft. NET框架程序设计(修订版) [M].李建忠,译.北京:清华大学出版社,2003.

[10]柴晓路.J2EE .Web服务谁主沉浮[EB/OL].[ 2004-03-07] ./developerWorks/cn/xml/theme/indexcxl.shtml,2004.

上一篇:基于串行通信的智能家居上位机设计 下一篇:基于WindML环境下的显卡驱动设计