级别: 初级 Doug Tidwell (dtidwell@us.ibm.com), Web 服务传道士, IBM
2001 年 1 月 01 日 作为 IBM 继续致力于 Web 服务的一部分,IBM 发布了 UDDI4J -- 通用发现、描述与集成协议(UDDI)的开放源码的实现。在这篇文章中,我们将讨论 UDDI 的基础,到 UDDI 的 Java API,以及如何用该技术开始构建、测试和部署您自己的 Web 服务。
在 Web 服务后面的中心思想是 Web将由各种各样的小段代码构成,所有这些可以通过 Web发布、查找和调用。用于该基于服务的 Web 的一个关键性技术是 SOAP --简单对象访问协议。SOAP,基于XML,允许应用程序与远程应用进行交互。这简直棒极了,但首先我们如何查找那些应用程序?这正是UDDI 所做的。
UDDI 提供三个基本功能,即众所周知的发布、查找和绑定:
- 发布:Web 服务的供应商如何注册自己。
- 查找:应用程序如何查找特定的 Web 服务。
- 绑定:在找到 Web 服务后,应用程序如何与之连接和交互。
UDDI 注册表包含三种信息,按照电话号簿描述:
- 白页:信息,如名称、地址、电话号码以及与特定企业的其他联系的信息。
- 黄页:关于分类企业的信息。这是基于已存在(非电子的)的标准(请参阅
参考资料)。
- 绿页:由特定企业提供的有关 Web 服务的技术信息。
当我使用 UDDI 注册表时,有四种信息类型对我很重要:
- 企业信息:包含在
BusinessEntity 对象中,它依次包含有关服务、类别、联系、URL和其他与特定企业所必须的信息。
- 服务信息:描述一组 Web 服务。这些包含在
BusinessService 对象中。
- 绑定信息:调用 Web 服务所必须的技术细节。这包括URL,以及有关方法名称、变量类型等信息。UDDI4J
BindingTemplate 对象表示该数据。
- 有关服务规范的信息:这是关于特定 Web服务实现各种规范的元数据。在 UDDI 规范中,这些称为 tModel;UDDI4J
TModel 对象表示这种数据。
在本文中,我将演示如何编写在 UDDI注册表中操纵对象的基本代码。您可以用 IBM 的 Test 注册表(请参阅
参考资料)测试您的应用程序或从 Web ServicesToolkit(请参阅
参考资料)下载 UDDI注册表服务器软件。
UDDI4J 包的内容
UDDI4J 包含 UDDI 的客户端实现(您的应用发布、查找和绑定 Web服务所需要的一切)。它还包括源代码、完整的 JavaDoc文档和三个样本应用。我将仔细检查
UDDIProxy 类(包中最重要的类)并且探讨三个样本应用。
UDDIProxy 类
这个类是将在 UDDI 应用程序中使用的最重要的对象。它有连接到 UDDI注册表、执行查询和处理结果所需要的所有方法。在这里讨论的样本应用中,
UDDIProxy 对象是我们用来与注册表交互的对象。
清单 1显示了如何创建这样的对象和在注册表指向它:
清单 1:用于创建UDDIProxy 的代码片段
UDDIProxy proxy = new UDDIProxy();
proxy.setInquiryURL("http://www-3.ibm.com/services/uddi/testregistry/inquiryapi");
proxy.setPublishURL("https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi");
|
这段代码创建对象,然后将代理指向 IBM UDDI 注册表。注意
setPublishURL 方法中的协议是
https,UDDI标准定义了任何人都能够查询注册表,但只有正确访问权限的应用程序和用户才能修改注册表信息。
样本应用 1:在 UDDI注册表中查找企业
其它类
UDDI4J 提供的其它类提供了对 UDDI注册表中所有可用信息的访问。譬如,
BusinessList 对象允许您访问一定数量的
BusinessInfo 对象。对于特定的
BusinessInfo 对象,可以访问
ServiceInfo 对象,该对象描述了它所提供的服务。UDDI4J 里的类映射到在 UDDIProgrammer API Specification 和 UDDI XML StructureReference(请参阅
参考资料)。
这个应用程序,
FindBusinessExample.java ,连接到 UDDI注册表,并试图查找满足特定标准的企业。在这个样本中,我们查找所有以字母S 开始的企业。
BusinessList bl = proxy.find_business("S", null, 0);
|
所有版本的
find_business 方法取三个参数:第一个是搜索参数,第二个是
FindQualifiers 对象(在这个示例中为
null ,第三个是返回匹配的数目(
0 意味返回所有匹配)。这里有几种不同的搜索参数,其中最简单的是搜索字符串。更多高级的搜索参数包括企业标识、企业类别、URL和
tModel 的集合。该方法返回一个
BusinessList 对象,一个可用于查找特定信息的集合,该信息是关于匹配搜索参数的所有企业。
一旦有了与我们搜索的标准相匹配的企业清单,这个代码通过循环该列表并打印所有匹配的企业名称:
清单2:用于打印匹配企业对象的代码片段
Vector businessInfoVector = bl.getBusinessInfos().getBusinessInfoVector();
for (int i = 0; i < businessInfoVector.size(); i++)
{
BusinessInfo businessInfo = (BusinessInfo)businessInfoVector.elementAt(i);
System.out.println(businessInfo.getNameString());
}
|
虽然第一个样本应用所做的是查找符合特定标准的 Web服务,但它确实做了一些有趣的事情。首先,它连接到 UDDI 注册表,使用Web服务中的第一步。其次,它查询注册表,以查找符合特定标准的企业。最后,它获取从注册表返回的信息,并且进行少量的对它有用的事情。我们下两个样本将进一步与UDDI 注册表交互。
样本应用 2:发布企业清单
在
SaveBusinessExample.java 中定义的应用实际上将企业发布到 UDDI注册表。正如我们第一个应用程序一样,
UDDIProxy 对象是这个过程的关键。然而,这里有几个重要的新技术。首先,我们需要从注册表获取身份验证。我们通过在
setPublishURL 方法中定义的安全套接字上提交用户标识和口令来获取它:
AuthToken token = proxy.get_authToken("userid", "password");
|
下一步是创建一个新的
BusinessEntity 对象,并让它具有我想让它有的各种特性。为了简化样本,我只定义了企业名称,并由极好命名的
setName 方法完成,在
清单3。
清单 3:用于创建一个新
BusinessEntity 的代码片段
Vector entities = new Vector();
BusinessEntity be = new BusinessEntity("");
be.setName("Sample business");
entities.addElement(be);
|
现在我已经定义了我们想要加到注册表中的实体,我们传递了我们的身份验证令牌和到注册表的实体向量:
BusinessDetail bd = proxy.save_business(token.getAuthInfoString(), entities);
|
为了验证我们的数据已经成功地发布到注册表,我打印了我们从
save_business 方法接收到的数据,如在
清单 4中所见。
清单4:用于打印从
save_business 方法得到的数据的代码片段
Vector businessEntities = bd.getBusinessEntityVector(); BusinessEntity returnedBusinessEntity =
(BusinessEntity)(businessEntities.elementAt(0)); System.out.println("Returned businessKey:" +
returnedBusinessEntity.getBusinessKey());
|
样本应用3:取消发布(删除)企业列表
UDDI4J 提供的最后一个示例
DeleteBusinessExample.java ,删除了我们刚定义的
BusinessEntity 。如第二个示例中,我必须获取一个身份验证令牌来更新注册表。要删除Sample 企业项目,我将搜索所有名为 “Sample 企业”的企业。
BusinessList bl = proxy.find_business("Sample business",null, 0);
|
现在我已经有了匹配的企业列表,我将试图删除每一个(请参阅
清单 5)。在注册表中可能有许多“Sample企业”的项;在我们的样本中这段代码不针对没有用我们的用户标识创建的任何项,所以我必须处理这种错误情况(事实上,所有的样本都处理错误,为了清晰省略这方面的讨论)。
清单5:用于删除匹配企业服务的代码片段
Vector businessInfoVector = bl.getBusinessInfos().getBusinessInfoVector();
for (int i = 0; i < businessInfoVector.size(); i++)
{
BusinessInfo bi = (BusinessInfo)businessInfoVector.elementAt(i);
System.out.println("Found business key:" + bi.getBusinessKey());
DispositionReport dr = proxy.delete_business(token.getAuthInfoString(),
bi.getBusinessKey());
if (dr.success())
{
System.out.println("Business successfully deleted");
}
else
// handle error case
|
总结
IBM 发布的 UDDI4J 为Web 服务开发者提供了完整而健壮的 UDDI客户端实现。有了该代码,您能够与任何 UDDI注册表交互,从而使您的应用可以全面访问 Web服务的世界。现在您准备好领导这一革命;从那里出来然后开始吧!
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 请访问
UDDI4J
项目站点,以便获取完整信息和最新的文件发行版。
- 关于 UDDI 信息最权威的源文件在
www.uddi.org. 该站点是由 IBM、Ariba
和 Microsoft 共同赞助的。这里可以回顾几篇主要的文档:
- 下载 IBM
Web Services Toolkit。 它包括用于测试您的 Web 服务的 UDDI4J
服务器。
- 用在 UDDI
注册表的“黄页”信息是典型地基于两个已存在的标准:NAICS (North
American Industry Classification System) 和 UNSPSC (Universal
Standard Products and Services Classification)。NAICS
是加拿大、墨西哥和美国政府的合作项目。完整的细节可在
www.naics.com
上找到。当联合国发展计划和 Dun & Bradstreet
将他们的成果合并成一个单一分类系统时,创建了 UNSPSC。请参阅
www.unspsc.org 查找有关 UNSPSC
的更多信息。
- IBM、Microsoft、DevelopMentor、Lotus 和 UserLand Software 将
SOAP 规范提交给 W3C。可以在
www.w3.org/TR/SOAP/
上了解它。
- developerWorks Web 服务专区提供了一篇关于构建基于 SOAP
的应用的
文章。
关于作者  | 
|  | 高级程序员 Doug Tidwell 是 developerWorks 的 Web
服务 和 XML 的传道士。他是 1943 年秘密的 Les Alamos XML
会议的主要发言人,一直使用标记语言超过三百年。它是 Labrador
Retrievers in Technology (LRT)
的活动成员。他拥有乔治亚大学的英语学士学位(太棒了!)和 Vanderbilt
大学的计算机科学硕士学位。他目前正在完成关于 XSLT
的书,这本书很快将由 O'Reilly and Associates
出版。在闲暇之余,他喜欢读书、旅游和在 developerWorks
上编写一些已发布但未编辑的滑稽的自传。可以通过
dtidwell@us.ibm.com
与他联系。
|
对本文的评价
|