Webサービス・アーキテクチャーは、主な3つの役割、つまりサービス・プロバイダー、サービス・レジストリー、およびサービス・リクエスターの間の対話に基づいています。これらの役割は、公開 (publish)、検索 (find)、バインド (bind) というオペレーションを介して相互に対話します。サービス・プロバイダーとは、Webサービスへのアクセスを提供し、サービス記述をサービス・レジストリーに公開する企業です。サービス・リクエスターはサービス・レジストリー内でサービス記述を検索し、その記述に含まれる情報を使ってサービスをバインドします。Webサービスの論理ビューが図1 に示されています。Webサービス・アーキテクチャーを表したこのビューでは、サービス記述を保管する中央制御された場所をサービス・レジストリーが提供しています。UDDIレジストリーは、このような種類のサービス・レジストリーの一例です。
図1: Webサービス・アーキテクチャー
中央制御されたサービス・レジストリーのモデルはとても重要ですが、Webサービス・ディスカバリーのモデルはこれだけではありません。最も単純な形態のサービス・ディスカバリーは、サービス記述のコピーをサービス・プロバイダーに要求することです。要求を受け取ったサービス・プロバイダーは、サービス記述を添付したe-mailを送ることもできますし、転送可能なメディア (たとえばディスケット) を使って記述をサービス・リクエスターに提供することもできます。この種類のサービス・ディスカバリーはシンプルですが、あまり効率的ではありません。これを利用するためには、Webサービスに関する予備知識と、サービス・プロバイダーの連絡先情報があらかじめ必要だからです。
この両者の中間的な方式として、サービス記述への参照をサービス・プロバイダーの提供ポイントで提供する分散サービス・ディスカバリー方式が必要とされています。Web Services Inspection Languageは、Webサービス提供元のWebサイトを検査する方法を指定することによって、このような分散ディスカバリー方式を確立します。WS-Inspection仕様は、WebサイトにおけるWebサービス記述の検索場所を定義します。
Web Services Inspection Languageは分散されたサービス・ディスカバリーに重点を置いています。このためWS-Inspection仕様は、Webサイトで利用可能になっているがUDDIレジストリーにはまだ登録されていないサービスを発見できるという点で、UDDIを補っています。Web Services Inspection LanguageとUDDIの関係についての詳細は、The WS-Inspection and UDDI Relationship をご覧ください (参考文献を参照)。
WS-Inspection仕様 (参考文献を参照) はサービス記述言語を定義するものではありません。WS-Inspection文書は、さまざまなタイプのサービス記述を集約する方式を提供します。1つのWS-Inspection文書の中では、1つのサービスに関して、複数のサービス記述参照を含めることができます。たとえば、1つのWebサービスをWSDLファイルで記述し、なおかつUDDIレジストリーにも記述することが可能です。これら2つの記述への参照を、1つのWS-Inspection文書の中に一緒に含めます。もっと多数の参照が存在する場合、そのすべてをWS-Inspection文書の中に含めれば、文書の消費者は、容易に理解できて利用したいと思うようなサービス記述を選ぶことができます。図2 は、WS-Inspection文書の使用方法をおおまかに示しています。
図2: WS-Inspectionの概要
WS-Inspection仕様には主に次のような2つの機能があり、以下のセクションでそれぞれ詳しく説明します。
- 既存のサービス記述への参照をリストするためのXML形式を定義する
- WS-Inspection文書を簡単に検索できるようにするための一連の規則を定義する
WS-Inspection文書は、いくつかのサービス記述への参照を集約します。これらのサービス記述は、WSDL、UDDI、または通常のHTMLなど、どんな形式でも定義できます。すでに述べたように、通常、WS-Inspection文書は、その文書内で参照されるサービスの提供ポイントにおいて準備されます。
1つのWS-Inspection文書には、いくつかのサービス記述への参照、および他のWS-Inspection文書への参照からなるリストが含まれます。WS-Inspection文書には、1つまたは複数の<service> 要素と<link> 要素が含まれます。<service> 要素には、1つの同じWebサービスに関するさまざまなタイプのサービス記述への参照を複数含めることができます。<link> 要素には、特定の1つのタイプのサービス記述への参照を含めますが、これらのサービス記述は必ずしも同じWebサービスを参照する必要はありません。
リスト1 は、簡単なWS-Inspection文書の例です。この例では、異なるサービス記述への参照が2つ、および別のWS-Inspection文書への参照が1つあります。最初の<service> 要素にはサービス記述が1つだけ含まれ、これはWSDL文書を参照しています。2番目の<service> 要素にもまた、サービス記述への参照が1つだけあります。この参照は、UDDIレジストリー内のあるビジネス・サービス・エントリーを参照しています。UDDIサービス・キーが1つの固有のビジネス・サービスを識別します。また、UDDIサービスへの参照には拡張性要素も含まれていますが、これについては次のセクションで説明します。<link> 要素は、一連のサービス記述の集合体を参照するために使われます。このケースでは、他のWS-Inspection文書を参照しています。
リスト1: WS-Inspection文書の例
<?xml version="1.0"?>
<inspection xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/">
<service>
<description referencedNamespace="http://schemas.xmlsoap.org/wsdl/"
location="http://example.com/exampleservice.wsdl" />
</service>
<service>
<description referencedNamespace="urn:uddi-org:api">
<wsiluddi:serviceDescription location=
"http://example.com/uddi/inquiryapi">
<wsiluddi:serviceKey>
52946BB0-BC28-11D5-A432-0004AC49CC1E</wsiluddi:serviceKey>
</wsiluddi:serviceDescription>
</description>
</service>
<link referencedNamespace=
"http://schemas.xmlsoap.org/ws/2001/10/inspection/"
location="http://example.com/tools/toolservices.wsil"/>
</inspection>
|
WS-Inspection仕様は、参照可能なサービス記述のタイプを限定していません。<description> 要素と<link> 要素のどちらにも、特定のサービス記述テクノロジーの情報を表す拡張性要素を含められます。WS-Inspection仕様は、WSDL用およびUDDI用の標準的な拡張性要素をいくつか定義しています。<description> 要素はただ1つのサービス記述を参照し、<link> 要素は1つまたは複数のサービス記述を参照しますら、これらの要素の拡張性要素を定義するとき、この同じパターンに従わなければなりません。
WSDLサービス記述は、<description> 要素の中からのみ参照できます。WSDL拡張性要素を使用すれば、端点の指定がWSDL文書の中に含まれるかどうかを示せます。WSDL文書内に複数のサービス要素が存在する場合、<wsilwsdl:referencedService> 要素を使って、WS-Inspection文書のエントリーに関連しているのはどれかを示す必要があります。WSDLサービス記述参照の中では、1つまたは複数の<wsilwsdl:implementedBinding> 要素を使用できます。これらの要素はそれぞれ、WSDLによって実装されるバインディングを参照します。リスト2 は、すべてのWSDL拡張性要素を含んでいるWS-Inspection文書の例です。
リスト2: WSDL拡張性要素を含んでいるWS-Inspection文書
<inspection xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/">
<service>
<description referencedNamespace="http://schemas.xmlsoap.org/wsdl/"
location="http://example.com/exampleservice.wsdl" />
</service>
<service>
<description referencedNamespace="urn:uddi-org:api">
<wsiluddi:serviceDescription location=
"http://example.com/uddi/inquiryapi">
<wsiluddi:serviceKey>
52946BB0-BC28-11D5-A432-0004AC49CC1E</wsiluddi:serviceKey>
</wsiluddi:serviceDescription>
</description>
</service>
<link referencedNamespace=
"http://schemas.xmlsoap.org/ws/2001/10/inspection/"
location="http://example.com/tools/toolservices.wsil"/>
</inspection>
|
UDDI拡張性要素は、<link> 要素または<description> 要素のどちらの内部でも使用できます。ただし<link> 要素内で使用する場合、UDDIビジネス・エンティティーしか参照できません。UDDIビジネス・エンティティーを参照しますから、この参照を解決すると1つまたは複数のサービス記述に関連付けられるでしょう。一方、<description> 要素内で使用する場合には、ただ1つのUDDIビジネス・サービスしか参照できません。リスト3 は、WS-Inspection文書用のUDDIバインディングの例です。
UDDIビジネス・エンティティーの参照を指定するために、<wsiluddi:businessDescription> 要素が<link> 要素の中で使われています。businessService要素には、discoveryURLとbusinessKeyのいずれか、または両方を含めることができます。businessKeyを指定した場合、businessDescription要素の場所 (location) 属性の中にレジストリー用の照会URLを含めなければなりません。このURLは、指定されたbusinessKeyを使ってget_businessDetail メッセージをUDDIレジストリーに送るために使用されます。
<wsiluddi:serviceDescription> 要素は<description> 要素の中でのみ使用することができ、ただ1つのサービス記述だけを参照できます。serviceDescription要素の内部では、discoveryURLとserviceKeyのいずれか、または両方を指定できます。serviceKeyを指定する場合、serviceDescriptionのlocation属性の中にUDDIレジストリー用の照会URLを含めなければなりません。
businessDescription要素とserviceDescription要素のどちらの場合も、discoveryURLとbusinessKeyまたはserviceKeyの両方を指定すると、WS-Inspection文書を処理している担当者はどちらを使用するか選べます。discoveryURLは常にUDDIビジネス・エンティティーを戻します。そこで、これをserviceDescription要素で使用するときには、ビジネス・エンティティー内の個々のサービス記述の場所を特定するために、serviceKeyを使用しなければなりません。
リスト3: UDDI拡張性要素を含んでいるWS-Inspection文書
<?xml version="1.0"?>
<inspection targetNamespace="http://schemas.xmlsoap.org/ws/2001/10/inspection/"
xmlns:wsiluddi="http://schemas.xmlsoap.org/ws/2001/10/inspection/uddi/"
xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/">
<link referencedNamespace="urn:uddi-org:api">
<wsiluddi:businessDescription location=
"http://www.getquote.com/uddi/inquiryapi">
<wsiluddi:businessKey>3BF0ACC0-BC28-11D5-A432-0004AC49CC1E<
/wsiluddi:businessKey>
<wsiluddi:discoveryURL useType="businessEntity">
http://www.getquote.com/uddi?businessKey=
3BF0ACC0-BC28-11D5-A432-0004AC49CC1E
</wsiluddi:discoveryURL>
</wsiluddi:businessDescription>
</link>
<service>
<name>UDDI Service Description</name>
<description referencedNamespace="urn:uddi-org:api">
<wsiluddi:serviceDescription location=
"http://www.getquote.com/uddi/inquiryapi">
<wsiluddi:serviceKey>52946BB0-BC28-11D5-A432-0004AC49CC1E<
/wsiluddi:serviceKey>
<wsiluddi:discoveryURL useType="businessEntity">
http://www.getquotecom/uddi?businessKey=
3BF0ACC0-BC28-11D5-A432-0004AC49CC1E
</wsiluddi:discoveryURL>
</wsiluddi:serviceDescription>
</description>
</service>
</inspection>
|
WS-Inspection仕様の1つの重要な機能は、あるWS-Inspection文書から他の1つまたは複数のWS-Inspection文書にリンクを設定できることです。この機能を利用すれば、さまざまなサービス記述参照をグループ化して別々の文書の中に入れることにより、サービス記述参照を管理できます。<link> 要素を使用すれば、個々の文書を組み合わせて一連のWS-Inspection文書の階層を作成できます。たとえば、さまざまなカテゴリーのサービスごとに別々のWS-Inspection文書を作成して、1つの主要なWS-Inspection文書の中に、それらすべての文書のリンクを一括して設定することができます。
WS-Inspection仕様の2番目の主要な機能は、WS-Inspection文書にアクセスできる場所を定義する方法です。WS-Inspection文書の検索および入手を簡単にするために、次の2つの規則が設けられました。
- 固定名のWS-Inspection文書
- リンクされたWS-Inspection文書
WS-Inspection文書の固定名はinspection.wsil です。この名前を持つ文書は、Webサイトの共通の起点 (エントリー・ポイント) に置かれます。たとえば、共通の起点がhttp://example.comあるいはhttp://example.com/servicesであれば、WS-Inspection文書の場所はそれぞれhttp://example.com/inspection.wsil、またはhttp://example.com/services/inspection.wsilとなります。
WS-Inspection文書への参照は、さまざまなコンテンツの文書 (たとえばHTMLページ) にも組み込むことができます。HTMLページ内にエントリーを組み込むとき、METAタグを使ってWS-Inspection文書の場所を取り入れることができます。リスト4 は、上記と同じWS-Inspection文書参照を含んでいるHTMLページの例です。これらの参照を組み込んだHTMLページは、広く利用されるでしょう。たとえば、これをWebサーバーのルート文書にすることができます。または、WS-Inspection文書に含まれる1つまたは複数のWebサービスを人間の読める形式で記述したWebページにすることもできます。
リスト4: HTMLページ内のWS-Inspection文書参照
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META name="serviceInspection" content=
"http://example.com/inspection.wsil"
<META name="serviceInspection" content="http://example.com/services/inspection.wsil"
<head>
...
<html>
|
Webサービス・ツールキットでのWS-Inspection仕様サポート
Web Services Toolkit V2.4.1 (参考文献を参照) には、Web Services Inspection Languageのサポートが組み込まれています。このサポートには、WS-Inspection文書の使用方法を例示するデモンストレーションと、既存のWS-Inspection文書を解析して新しい文書をプログラム的に作成するJava APIとが含まれています。
ツールキットのほとんどのデモには、サービス・ディスカバリー・メカニズムとしてWS-InspectionテクノロジーとUDDIのいずれかを選択できるオプションがあります。WS-Inspectionオプションを使用する場合、デモは、ツールキットの構成ユーティリティーを使って構成されるWebサーバーからのWS-Inspection文書を要求します。この要求は、WS-Inspection文書の固定名を使って発信されます。この文書名は、Javaサーブレットを呼び出すよう設定されています。このサーブレットは、WSDLサービス記述文書をツールキット・ディレクトリー構造の中で検索することによって、WS-Inspection文書を動的に作成します。
図3 はこのプロセスの概要を示しています。
- WS-Inspection文書プロキシーは、固定名を使ってWS-Inspection文書のコンテンツを要求するために使用されます。
- WS-Inspection文書の検索に使われるURLは、サーブレットにマップします。このサーブレットはローカル・ファイル・システム内を検索して、すべてのWSDLサービス記述を探し出します。それぞれのサービス記述への参照は、WS-Inspection文書の中に組み入れられます。
- 動的に生成されたWS-Inspection文書がクライアントに戻されます。
図3: Web Services ToolkitにおけるWS-Inspection文書サポート
リスト5 は、WS-Inspectionサーブレットによって戻されるWS-Inspection文書の一部です。サービス名は、WSDL文書の中のdefinition要素のname属性から設定されます。このリストに示されているエントリーは、株式相場情報のデモです。
リスト5: Web Services Toolkitによって生成されるWS-Inspection文書
<?xml version="1.0"?>
<inspection xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/">
...
<service>
<name xml:lang="en-US">StockQuoteService</name>
<description referencedNamespace="http://schemas.xmlsoap.org/wsdl/"
location="http://localhost:8080/webservices/wsdl/stockquote/sqs.wsdl">
<wsilwsdl:reference endpointPresent="true">
<wsilwsdl:implementedBinding
xmlns:interface="http://www.getquote.com/StockQuoteService-interface">
interface:StockQuoteServiceBinding
</wsilwsdl:implementedBinding>
</wsilwsdl:reference>
</description>
</service>
...
</inspection>
|
Web Services Inspection Language for Java APIを使用する
Web Services Inspection Language for Java API (WSIL4J) が提供するJavaインターフェースを使用して、既存のWS-Inspection文書を解析したり、新しいWS-Inspection文書をプログラム的に生成することができます。ほとんどのWSIL4Jクラスは、WS-Inspection文書に組み込むことのできる要素を表します。たとえば<inspection> 要素はInspection クラスによって表され、<service> 要素はService クラスによって表されます。そのほか、WS-Inspectionの読み取りと解析を簡単にするユーティリティー・クラスや、WSIL4JオブジェクトのコンテンツをXML文書として書き出すユーティリティー・クラスもあります。
リスト6 は、このAPIの使用例を示しています。このサンプル・コードでは、WS-Inspection文書が読み取られ、service要素の中でWSDLサービス記述への参照が検索されます。WSDLサービス記述が見つかると、その場所は、コンソールに表示可能なリストの一部として保存されます。このWSInspectionExampleアプリケーションの全体を、表示またはダウンロードできます (参考文献を参照)。すでにツールキットをインストール済みであれば、wstkenv コマンドを使用して、これらの例のコンパイルと実行に必要なクラスパスを設定できます。このコマンドはWSTK binディレクトリーに格納されています。このコマンドの目的は、一連の環境変数を定義することです。環境変数の1つにWSTK_CPがあります。この環境変数に、例をコンパイルして実行するのに必要なクラスパスが含まれています。
リスト6: WS-Inspectionアプリケーションの例
...
// Create a new instance of a WS-Inspection document
WSILDocument document = WSILDocument.newInstance();
// Read and parse the WS-Inspection document
document.read(wsinspectionURL);
// Get the inspection element from the document
Inspection inspection = document.getInspection();
// Obtain a list of all service elements
Service[] services = inspection.getServices();
// Display purpose of list
System.out.println("Display list of WSDL service description references...");
// Process each service element to find all WSDL document references
for (int serviceCount = 0; serviceCount < services.length; serviceCount++)
{
// Get the next set of description elements
descriptions = services[serviceCount].getDescriptions();
// Process each description to find the WSDL references
for (int descCount = 0; descCount < descriptions.length; descCount++)
{
// If the referenced namespace is for WSDL, then save the location reference
if (descriptions[descCount].getReferencedNamespace().equals(WSDLConstants.NS_URI_WSDL))
{
// Add WSDL location to the list
wsdlList.add(descriptions[descCount].getLocation());
}
}
// If this service has WSDL service descriptions, then display the list
if (wsdlList.size() > 0)
{
// Get service name
serviceName = (services[serviceCount].getServiceNames().length == 0) ?
"[no service name]" : services[serviceCount].getServiceNames()[0].getText();
// Display service name
System.out.println(" Service: " + serviceName);
// Display list
Iterator iterator = wsdlList.iterator();
for (int count = 1; iterator.hasNext(); count++)
{
System.out.println(" [" + count + "] " + ((String) iterator.next()));
}
}
// Clear the list
wsdlList.clear();
}
|
WSIL4J APIに含まれているWSILProxy クラスを使用すれば、WS-Inspection文書内のいくつかの情報に簡単にアクセスできます。このプロキシー・インターフェースはWS-Inspection文書を読み取って、希望のUDDIビジネス・サービス用のWSDL文書に直接アクセスできるようにします。リスト7 はアプリケーションの一部であり、特定のサービス名に対応するWSDL文書のリストを得するためにWS-Inspectionプロキシーを使用する方法を示しています。このWSInspectionProxyExampleアプリケーション全体もまた、表示またはダウンロードできます (参考文献を参照)。
リスト7: WS-Inspectionプロキシーの使用例
<?xml version="1.0"?>
<inspection xmlns="http://schemas.xmlsoap.org/ws/2001/10/inspection/" ...>
<service>
<abstract>Get a random lyrical phrase from one of the world's
best singer/songwriters, Neil Finn</abstract>
<description referencedNamespace='http://schemas.xmlsoap.org/wsdl/'
location='http://www.nickhodge.com/nhodge/finnwords/finnwords.wsdl'/>
<description referencedNamespace='http://www.xmethods.net/'>
<wsilxmethods:serviceDetailPage
location='http://www.xmethods.net/ve2/ViewListing.po?serviceid=90601'>
<wsilxmethods:serviceID>90601</wsilxmethods:serviceID>
</wsilxmethods:serviceDetailPage>
</description>
</service>
...
</inspection>
|
この記事ではWeb Services Inspection Languageについて概説し、この仕様が、あらゆるタイプのWebサービス記述文書用のシンプルかつ分散されたサービス・ディスカバリー方式を提供する様子を示しました。さらに、Webサイト内のサービス記述を検索するプロセスを定義するWS-Inspectionテクノロジーが、(UDDIのような) 既存のサービス・ディスカバリー方式をどのように補うかについても説明しました。
開発者たちは今後、WS-Inspectionテクノロジーの他の利用方法を見出すでしょう。たとえば、Webサービス記述リポジトリー用のWS-Inspectionインターフェースが実装されるかもしれません。また、Webサービス・クローラーの開発にこのテクノロジーが利用されるかもしれません。このようなサービス・クローラーはさまざまなWebサイトを探索してWS-Inspection文書を見つけ出し、複数のサイトにあるサービス記述参照を集約するでしょう。このテクノロジーのこうした適用分野、また他の適用分野が開発されるにつれて、Web Services Inspection LanguageはWebサービス使用モデルの中で重要な位置を占めるようになるでしょう。
- developerWorksサイトのWeb Services Inspection Language (WS-Inspection) 仕様をご覧ください。
-
The WS-Inspection and UDDI Relationship は、WS-InspectionとUDDIの関係について説明したペーパーです。
-
IBM Web Services Toolkit V2.4.1 をダウンロードできます。このツールキットには、WS-Inspection仕様の実装が含まれています。
-
WSInspectionExample およびWSInspectionProxyExample の全体を、developerWorksからダウンロードできます。
- uddi.orgに公開されているUDDI仕様をご覧ください。
-
WSDL V1.1仕様には、WSDL文書の構造について説明されています。
Peter Brittenham氏は現在、IBM Web Services Toolkit の主任アーキテクトです。Web Services Toolkitには、SOAPやWSDLを使用してWebサービスを構築するのに必要なツールとランタイム・サポート、およびWS-Inspection文書やUDDIレジストリーを使用してサービス定義を公開したり検索したりするためのランタイム・サポートが含まれています。