WSDL 2.0 で REST Web サービスを記述する

手順の説明

根本的には Web サービスが定義するのは、ネットワークと XML を使用したマシン間の相互作用メカニズムです。Web サービスでは Web サービス記述言語 (WSDL) による形式の記述が重要な要素となりますが、最近になるまで REST (REpresentational State Transfer) Web サービスを記述するための形式言語はありませんでした。そこで登場したのが、WSDL 2.0 です。この記事では REST と WSDL 2.0 の概要を紹介し、WSDL 2.0 で REST Web サービスを記述する方法を説明します。

Lawrence Mandel, Rational Software Developer, IBM

Lawrence Mandel photoLawrence Mandel は IBM Toronto Lab のソフトウェア開発者として、現在 IBM Rational 向けのレポート作成ソリューションに取り組んでいます。また、WSDL 2.0 検証パーサーおよび関連ツールを開発するプロジェクト、Apache Woden のリーダーでもあります。彼は『Eclipse Web Tools Platform: Developing Java Web Applications』の共著者です。



2008年 5月 29日

はじめに

Web サービスという言葉は通常、SOAP および WS-Addressing や WS-Security などの WS* 標準に従った操作またはアクション・ベースのサービスに結び付けられます。一方、REST Web サービスという言葉が一般的に意味するのは、HTTP と XML を使用したリソース・ベースの Web サービス・アーキテクチャーです。この 2 つのアーキテクチャーの Web サービス・スタイルにはそれぞれに適材適所がありますが、WSDL 標準では最近になるまで両方のスタイルを等しくはサポートしていませんでした。WSDL 1.1 HTTP バインディングは HTTP と XML による通信を記述するには適切ではありません。そのため WSDL で、ある形式に従って REST Web サービスを記述する手段はありませんでした。そこで W3C (World Wide Web Consortium) 勧告として発表されたのが、WSDL 2.0 です。WSDL 2.0 はREST Web サービスを考慮して設計されています。これはつまり、REST Web サービスを記述するための言語の誕生を意味します。

REST

REST は、Web をリソース中心のアプリケーションとして捉えたアーキテクチャー・スタイルです。これが実際に意味していることは、RESTful なアプリケーションでは各 URL が 1 つのリソースを表しているということです。これらの URL は理解するにも覚えるにも簡単です。ブックストアで定義する URL の例を挙げると、販売する書籍のリストには http://www.bookstore.com/books/、ISBN が 0321396855 に設定された特定の書籍に関する詳細には http://www.bookstore.com/books/0321396855/ という URL が定義されます。これは、アクション中心のアプリケーションとは対照的です。アクション中心のアプリケーションでは、アクションを長々とした不可解な URL で、例えば http://www.bookstore.com/action/query?t=b&id=11117645532&qp=0321396855 のように記述します。このなかで、クエリー・パラメーターは結果をフィルタリングするために使用されていますが、同じブックストアを例に取ると、subject パラメーターを指定すれば、書籍リストを特定のジャンルに関する書籍に絞り込むことができます。例えば、URL に http://www.bookstore.com/books/?subject=computers/eclipse を指定すると、Eclipse プラットフォームに関する書籍のリストが返されます。

REST という用語は、Roy Fielding 博士が「アプリケーション状態のエンジンとしてのハイパーメディア」に関する彼の博士論文のなかで作り出したものです。これはつまり、リソースにはハイパーリンクが含まれることになり、これらのハイパーリンクによって、リソース状態の変更、あるいは別のリソースへの転送という遷移が可能になることを意味します。ハイパーリングは人間が使用するように意図された (X)HTML アプリケーションでは一般的ですが、マシンが使用することを目的とした XML では通常、使用されることはありませんでした。REST Web サービスは (X)HTML と同様に、XML でハイパーリンクを利用します。

従来の Web アプリケーションは、HTTP の GET または POST 操作を使ってリソースにアクセスします。その一方、RESTful なアプリケーションでは HTTP の動詞 (メソッド) (POST、GET、PUT、および DELETE) 全般を使用した CRUD (Create、Read、Update、Delete) スタイルでリソースにアクセスします。

REST アプリケーションにはもう1 つ、重要な要素があります。それは、RESTful なアプリケーションはステートレスでなければならないということです。つまり、REST アプリケーションではサーバーにセッション状態が保存されません。リクエストを処理するために必要なすべての情報は、リクエスト・メッセージ自体に含まれます。したがって、クライアントはリソースの表現をキャッシュに入れることができるので、サービスが明示的にそれを許可している場合はアプリケーションのパフォーマンスが大幅に向上します。REST についてさらに詳しく学ぶには、この記事の最後にある「参考文献」セクションを参照してください。

他のコンテンツ・タイプを返す場合

通常、Web サービスはデータを XML として返しますが、サービスの利用者に役立つコンテンツ・タイプは他にもあります。例えば、Ajax (Asynchronous JavaScript + XML) アプリケーションが受け取るデータとして適しているのは一般的に JSON (JavaScript Object Notation) ですが、利用者である人間にとってはデータをブラウザーでレンダリング可能な HTML として受け取るほうが便利です。

HTTP の世界では、データ・フォーマットの選択はコンテンツ・タイプ・ネゴシエーションとして知られています。コンテンツ・タイプ・ネゴシエーションではクライアントが優先コンテンツ・タイプと許容可能なコンテンツ・タイプを指定すると、サービスが最適なコンテンツ・タイプで応答します。つまり、クライアント A は Web サービスからのデータをXML として要求する一方、クライアント B はデータを JSON やその他のタイプとして要求するといったことが可能になります。

クライアントがコンテンツ・タイプを要求できるようにするには、サービスが組み込み HTTP Content-Type ヘッダー、Content-Type: text/html を使用するように構成します。

Content-Type ヘッダーに対応していないアプリケーションの場合には、例えば http://www.bookstore.com/books/?cType=application/xml のように、cType などのパラメーターを URL に指定するという方法を代わりに使用することができます。

WSDL と REST

WSDL 記述にはWeb サービスの詳細すべてが含まれます。その内容には以下のものがあります。

  • サービスの URL
  • サービスが理解する通信メカニズム
  • サービスが実行可能な操作
  • サービスが使用するメッセージの構造

クライアントはこれらの詳細情報を使用してサービスとやりとりをします。

このことから明らかなのは、REST Web サービスでこれまで WSDL を使用しなかった大きな理由の 1 つは、WSDL 1.1 の HTTP バインディングが REST Web サービスを記述するのに不適切だったということです。

WSDL 2.0 は 2007年6月に W3C 勧告として宣言されました。この WSDL のセカンド・バージョンは、WSDL 1.1 での問題に対処することを目的に作成されています。その問題の多くは WS-I (Web Services Interoperability) 組織によって明らかにされたものです。さらに、WSDL 2.0 は優れた HTTP バインディング・サポートも備えています。

WSDL は、Web サービスをある形式に従って記述するための XML 言語です。ここで、Web サービスの WSDL 記述によるクライアントとの API 契約を考えてみてください。WSDL 記述では、Web サービスのアドレス、許容される通信方法、インターフェース、そしてメッセージ・タイプが指定されます。要するに、WSDL 記述はクライアントが Web サービスを使用するために必要とするすべての情報を提供するということです。

WSDL の有用性は、API 契約として使用する場合だけに限られません。WSDL は形式を定義するので、以下のようなアクションを実行する Web サービス・ツールでも使用することができます。

  • さまざまな言語でのクライアントおよびサービスのスタブの生成
  • Web サービスの公開
  • Web サービスの動的テスト

Web サービス・ツールの大半では WSDL 1.1 をサポートしている一方、WSDL 2.0 をサポートするものも増えてきています。例えば、Apache Web サービス・プロジェクトには現時点で WSDL 2.0.をサポートする 2 つのサブプロジェクトがあります。Woden は Java™ をベースとした WSDL 2.0 検証パーサーで、このプロジェクトにも WSDL 文書を人間が読みやすい形にする XSLT (XSL Transformation) WSDL 2.0 プリティー・プリンターが含まれています。同じく Apache による Axis2 は、WSDL 2.0 文書から Java のクライアントおよびサーバーのスタブを生成することが可能な Web サービス・ランタイム・エンジンとしてよく使用されています。


WSDL 2.0 で REST Web サービスを記述する

この記事の残りでは、REST Web サービスの WSDL 2.0 記述を作成するために必要な手順を以下の単純なサンプル・シナリオに沿って説明します。

あなたはブックストアの経営者です。このブックストアの URL は http://www.bookstore.com で、以下の 2 つの REST Web サービスがすでに作成されています。

  • ブックストアで販売している書籍のリストを取得する書籍リスト作成サービス
  • 特定の書籍に関する詳細情報を取得する書籍詳細情報サービス

情報は XML 文書で返されます。以下で、上記のサービスの詳細を説明します。

書籍リスト作成サービスの URL は http://www.bookstore.com/books/ です。このブックストアは定評のある小売店なので、書籍リストはかなり大きいものになります。そこで、顧客が結果を絞り込めるように、次のような一連のクエリー・パラメーターを用意しました。

  • 著者
  • 言語
  • 出版社
  • ジャンル
  • タイトル

例えば、URL を http://www.bookstore.com/books/?subject=computers/eclipse に設定すると、Eclipseに関するコンピューターの書籍リストが返されます (リスト 1 を参照)。

リスト 1. 書籍リスト作成サービスからのレスポンス
<booklist:bookList xmlns:booklist="http://www.bookstore.org/booklist/xsd"
   xmlns:book="http://www.bookstore.org/book/xsd"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.bookstore.org/booklist/xsd booklist.xsd 
                       http://www.bookstore.org/book/xsd book.xsd">

  <booklist:book url="http://www.bookstore.com/books/0321442598"
     title="BIRT: A Field Guide to Reporting"/>
  <booklist:book url="http://www.bookstore.com/books/0321205758"
     title="Contributing to Eclipse: Principles, Patterns, and Plug-Ins"/>
  <booklist:book url="http://www.bookstore.com/books/0321245873"
     title="Eclipse AspectJ: Aspect-Oriented Programming with AspectJ and the..."/>
  <booklist:book url="http://www.bookstore.com/books/0321288157"
     title="Eclipse Distilled"/>
  <booklist:book url="http://www.bookstore.com/books/0131425420"
     title="Eclipse Modeling Framework"/>
  <booklist:book url="http://www.bookstore.com/books/0321334612"
     title="Eclipse Rich Client Platform: Designing, Coding, and Packaging Java..."/>
  <booklist:book url="http://www.bookstore.com/books/0321396855"
     title="Eclipse Web Tools Platform: Developing Java Web Applications"/>
  <booklist:book url="http://www.bookstore.com/books/032142672X"
     title="Eclipse: Building Commercial-Quality Plug-Ins (2nd Edition)"/>
  <booklist:book url="http://www.bookstore.com/books/0321443853"
     title="Integrating and Extending BIRT"/>
  <booklist:book url="http://www.bookstore.com/books/0321268385"
     title="Official Eclipse 3.0 FAQs"/>
  <booklist:book url="http://www.bookstore.com/books/0321256638"
     title="Official Eclipse 3.0 FAQs"/>
</booklist:bookList>

書籍詳細情報サービスの URL は http://www.bookstore.com/books/ISBN_NUMBER です。ここに含まれる ISBN_NUMBER は、特定の書籍の ISBN と置き換えます。例えば、URL を http://www.bookstore.com/books/0321396855 に設定すると、私の書著、『Eclipse Web Tools Platform』(この書籍の Web サイトへのリンクは「参考文献」を参照) の詳細が返されます (リスト 2 を参照)。

リスト 2. 書籍詳細情報サービスからのレスポンス
<book:book xmlns:book="http://www.bookstore.org/book/xsd" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.bookstore.org/book/xsd book.xsd">
  <book:title>Eclipse Web Tools Platform: Developing Java Web Applications</book:title>
  <book:author>
    <book:firstName>Naci</book:firstName>
    <book:lastName>Dai</book:lastName>
  </book:author>
  <book:author>
    <book:firstName>Lawrence</book:firstName>
    <book:lastName>Mandel</book:lastName>
  </book:author>
  <book:author>
    <book:firstName>Arthur</book:firstName>
    <book:lastName>Ryman</book:lastName>
  </book:author>
  <book:overview>
Discover Eclipse Web Tools Platform (WTP), the new end-to-end toolset for Java-based
Web development. The WTP seamlessly integrates all of the tools today's Java Web 
developer needs. Eclipse WTP is both an unprecedented open source resource for 
working developers and a powerful foundation for state-of-the-art commercial products.
This book offers in-depth descriptions of every tool included in WTP, introducing powerful
capabilities never before available in Eclipse. The authors cover the entire 
Web-development process -- from defining Web application architectures and 
development processes through testing and beyond. And if you're seeking to extend WTP,
this book provides an introduction to the platform's rich APIs. The book also
  </book:overview>
  <book:pages>752</book:pages>
  <book:publisher>Addison-Wesley Professional</book:publisher>
  <book:language>English</book:language>
  <book:isbn-10>0321396855</book:isbn-10>
  <book:isbn-13>978-0321396853</book:isbn-13>
  <book:price>54.99</book:price>
</book:book>

以下のシナリオでは、上記で概説した内容を適用して、書籍リスト作成サービスの WSDL 2.0 記述を作成する方法を説明します。書籍詳細情報サービスはこのシナリオでは役に立つものの、その WSDL 記述は構造的に変わらないため、この記事では取り上げません。ただし、書籍リストと書籍詳細情報の WSDL 2.0 記述、そしてリスト1リスト2 のサンプル文書は記事の終わりにある「ダウンロード」セクションから入手することができます。

書籍リスト作成サービスの WSDL 記述に取り掛かる前に、まずは WSDL 2.0 の基本を説明します。

WSDL 2.0 の基本

WSDL 2.0 は、コアとなる名前空間が http://www.w3.org/ns/wsdl の XML 言語です。WSDL 2.0 文書のルート要素は description 要素で、この description が持つ 4 つの子要素がまとまって Web サービスの詳細すべてをカプセル化します。この 4 つの子要素は以下のとおりです。

  • types
  • interface
  • binding
  • service

WSDL 2.0 文書のスケルトンをリスト 3 に記載します。

リスト 3. WSDL 2.0 文書のスケルトン
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl">
  <wsdl:types/>
  <wsdl:interface/>
  <wsdl:binding/>
  <wsdl:service/>
</wsdl:description>

WSDL 2.0 での変更点について

WSDL 2.0 文書の構造は、いくつかの点で WSDL 1.1 とは顕著に異なっています。以下のリストはWSDL 2.0 と WSDL 1.1 で異なる点をすべて網羅しているわけではありませんが、特に顕著な 2、3 の点は含まれています。

  • ルート要素が definitions から description に変更されました。
  • portType 要素が interface 要素に置き換えられ、その用途がよりわかりやすくなっています。
  • message 要素はグローバル要素でなくなりました。メッセージ記述は interface 要素にカプセル化されるようになっています。
  • バインディングを再利用できるようになりました。これは特定のインターフェースに関連付ける必要はありません。関連付けはサービス宣言の中で行うことができます。
  • WSDL 1.1 ではさまざまな方法でインポートすることができた XML スキーマは、types 要素の直接の子として xsd:import 要素を使用してインポートします。

types 要素には、Web サービスのメッセージを記述するすべての XML スキーマ要素と型定義が含まれます。WSDL 2.0 では他の型システムを自由に使えることになっていますが、実際に使用されているのは XML スキーマだけです。

interface 要素は Web サービスの操作 (特定の入力、出力、渡される障害メッセージを含む)、そしてこれらの操作が渡される順番を定義します。

binding 要素はクライアントが Web サービスと通信する方法を定義します。REST Web サービスの場合、バインディングはクライアントが HTTP を使用して通信できるということを指定します。

service 要素は、Web サービスのアドレスを特定のインターフェースおよびバインディングに関連付けます。

WSDL 2.0 では REST Web サービスに対し、対象の名前空間をさらに 2 つ定義しています。

  • HTTP 名前空間 http://www.w3.org/ns/wsdl/http。HTTP バインディング要素を組み込みます。
  • WSDL 拡張の名前空間 http://www.w3.org/ns/wsdl-extensions。ここには 3 つの属性の定義が組み込まれます。そのうちの 2 つは XML 文書内のハイパーリンクを Web サービス記述に関連付ける属性、もう 1 つは Web サービス操作が安全であると記述するための属性です。

ここからは、このセクションで取り上げたすべての WSDL 要素について詳しく説明していきます。

書籍リスト作成サービスのアドレス指定

前述のとおり、書籍リスト作成サービスの URL は http://www.bookstore.com/books/ です。このサービスをアドレス指定するために使用するのは WSDL service 要素で、この要素には 1 つ以上の endpoint 子要素が必要となります。この endpoint 要素の address 属性が、サービスの URL を指定するために使用されます (リスト 4 を参照)。また、endpoint 要素は binding 属性を使ってバインティングをサービスに関連付けるという役割も果たします。一方、service 要素は、interface 属性を使ってインターフェースをサービスに関連付けます。インターフェースとバインディングは以降のセクションで作成するので、これらの属性の値はとりあえず空白のままにしておいてください。

書籍リスト作成サービスの WSDL 2.0 文書には対象の名前空間も必要となるので、http://www.bookstore.org/booklist/wsdl という名前空間を定義します。

リスト 4. 書籍リスト作成サービスの定義
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
   targetNamespace="http://www.bookstore.org/booklist/wsdl"
   xmlns:tns="http://www.bookstore.org/booklist/wsdl">

  <wsdl:service name="BookList" interface="">
    <wsdl:documentation>
       The bookstore's book list service.
    </wsdl:documentation>
    <wsdl:endpoint name="BookListHTTPEndpoint"
       binding=""
       address="http://www.bookstore.com/books/">
    </wsdl:endpoint>
  </wsdl:service>
</wsdl:description>

書籍リスト作成サービスとの HTTP による対話

書籍リスト作成サービスのバインディング定義では、サービスが HTTP を使用して通信するように指定する必要があります。それには、binding 要素の type 属性に http://www.w3.org/ns/wsdl/http の値を指定します。

バインディングはオプションでインターフェースを参照することもできます。interface 属性は次のセクションで作成するので、空白のままにしておいてください。インターフェースをバインディングに関連付ける場合、 binding 要素ではインターフェース operation 要素をそのまま反映する operation 子要素をオプションで宣言することもできます。インターフェースを作成した後は、スタブ operation 要素を作成して、この参照に組み込む必要があります。

HTTP 通信 で使われる動詞 (メソッド) には以下の 4 つがあります。

  • GET
  • PUT
  • POST
  • DELETE

書籍リスト作成サービスは読み取りリクエストなので、通信手段となるのは HTTP GET です。GET メソッドを operation 要素に設定するには、WSDL 2.0 HTTP 名前空間の HTTP method 属性を使います。この属性は、description 要素で名前空間 http://www.w3.org/ns/wsdl/http が前もって宣言されていないと使用できません。

リスト 5 に、書籍リスト作成サービスの HTTP バインディング宣言を記載します。endpoint 要素のバインディング参照が tns:BookListHTTPBinding を参照するように更新すれば、バインディングの宣言は完成です。

リスト 5. 書籍リスト作成サービスのバインディング定義
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
   targetNamespace="http://www.bookstore.org/booklist/wsdl"
   xmlns:tns="http://www.bookstore.org/booklist/wsdl"
   xmlns:whttp="http://www.w3.org/ns/wsdl/http">

  <wsdl:binding name="BookListHTTPBinding"
     type="http://www.w3.org/ns/wsdl/http"
     interface="">
    <wsdl:documentation>
       The RESTful HTTP binding for the book list service.
    </wsdl:documentation>
    <wsdl:operation ref="" whttp:method="GET"/>
  </wsdl:binding>

  <wsdl:service name="BookList" interface="">
    <wsdl:documentation>
       The bookstore's book list service.
    </wsdl:documentation>
    <wsdl:endpoint name="BookListHTTPEndpoint"
       binding="tns:BookListHTTPBinding"
       address="http://www.bookstore.com/books/">
    </wsdl:endpoint>
  </wsdl:service>
</wsdl:description>

書籍リスト作成サービス操作の定義

ここまでのところで、書籍リスト作成 Web サービスをアドレス指定して通信する方法はわかったはずです。次は、書籍リスト作成サービスの操作を指定して、書籍リスト作成サービスの実行内容を記述します。

サービスの操作を定義するには、interface 要素とその子要素である operation を使用します。この書籍リスト作成サービスの場合に定義するのは、リクエストに対して書籍リストで応答する getBookList 操作だけです。

続いて operation 要素で以下の 3 つの属性を指定します。

  • pattern: 操作のメッセージ交換パターン (MEP) を指定するために使用します。MEP は操作におけるメッセージ・シーケンスとその方向を定義します。このシナリオでは、値を http://www.w3.org/ns/wsdl/in-out に指定して、サービスが1 つの入力メッセージ (書籍リストのリクエスト) を受信すると、1 つの出力メッセージ (書籍リスト) を送信するように定義します。この MEP をサポートするには、operation 要素の 2 つの子要素、inputoutput を指定します。この 2 つの要素は、メッセージ構造を定義する XML スキーマ要素を参照するために使用されます。メッセージ構造は次のセクションで作成します。
  • style: 操作に関する追加情報を指定するために使用します。この属性の値は http://www.w3.org/ns/wsdl/style/iri に指定してください。こうすると、input 要素の中身に対して XML スキーマ要素だけが使用されるようにするなどの制限が設定されます。
  • wsdlx:safe: WSDL 拡張の名前空間からの属性で、この操作がべき等であることを宣言します。この種の操作はリソースを変更しないため、何度呼び出しても結果は同じになります。この要素を使用するには、description 要素で WSDL 拡張の名前空間 http://www.w3.org/ns/wsdl-extensions を宣言します。

事前定義された MEP、スタイル、safe 属性定義は、「WSDL 2.0 Part 2: Adjuncts」(「参考文献」にリンクを記載) で確認することができます。

リスト 6 に記載した書籍リスト作成サービスのインターフェース宣言を見てください。service および binding 要素のインターフェース参照、バインディング operation 要素のインターフェース操作参照を更新すれば、インターフェースと操作は宣言されたことになります。

リスト 6. 書籍リスト作成サービスのインターフェース定義
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
   targetNamespace="http://www.bookstore.org/booklist/wsdl"
   xmlns:tns="http://www.bookstore.org/booklist/wsdl"
   xmlns:whttp="http://www.w3.org/ns/wsdl/http"
   xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions">

  <wsdl:interface name="BookListInterface">
    <wsdl:operation name="getBookList"
       pattern="http://www.w3.org/ns/wsdl/in-out"
       style="http://www.w3.org/ns/wsdl/style/iri"
       wsdlx:safe="true">
      <wsdl:documentation>
         This operation returns a list of books.
      </wsdl:documentation>
      <wsdl:input element=""/>
      <wsdl:output element=""/>
    </wsdl:operation>
  </wsdl:interface>

  <wsdl:binding name="BookListHTTPBinding"
     type="http://www.w3.org/ns/wsdl/http"
     interface="tns:BookListInterface">
    <wsdl:documentation>
       The RESTful HTTP binding for the book list service.
    </wsdl:documentation>
    <wsdl:operation ref="tns:getBookList" whttp:method="GET"/>
  </wsdl:binding>

  <wsdl:service name="BookList" interface="tns:BookListInterface">
    <wsdl:documentation>
       The bookstore's book list service.
    </wsdl:documentation>
    <wsdl:endpoint name="BookListHTTPEndpoint"
       binding="tns:BookListHTTPBinding"
       address="http://www.bookstore.com/books/">
    </wsdl:endpoint>
  </wsdl:service>
</wsdl:description>

書籍リスト作成サービス操作メッセージの定義

書籍リスト作成 Web サービスのメッセージには、入力メッセージと出力メッセージの 2 つがあります。サービスに送信するメッセージ、そしてサービスから送られてくるはずの受信メッセージをクライアントが把握できるように、特定のメッセージ構造を記述する必要があります。

WSDL 2.0 ではメッセージの内容を記述するシステムとして複数のシステム・タイプをサポートしますが、実際に使用されているのは XML スキーマだけです。このセクションでは、XML スキーマの詳細については説明しません。XML スキーマは WSDL 1.1 などの他の多くのアプリケーションで使用されており、XML スキーマに関する優れた記事は多数あります。このセクションでは、書籍リスト作成 REST Web サービスに XML スキーマを使用する方法、そして WSDL 2.0 で定義されている追加属性を使用してスキーマ属性にアノテーションを付ける方法を取り上げます。

書籍リスト作成 REST Web サービスの 2 つのメッセージを作成するには、以下の 2 つのグローバル要素を作成します。

  • getBookList。入力メッセージを表すこの要素には含まれるのは一連の要素のシーケンスです。これらの要素には、サービスで許可するクエリー・パラメーター、つまり著者、タイトル、出版社、ジャンル、言語のそれぞれも含まれます。前の手順でインターフェース操作には IRI スタイルが指定されていることから、getBookList 要素の中身は要素のみに限られます。
  • bookList。出力メッセージを表すこの要素には一連の book 要素が含まれ、それぞれの book 要素に title 属性と url 属性が含まれます。title 属性の内容は一目瞭然のはずです。url 属性は、特定の書籍に関する詳細を返す書籍詳細情報 REST Web サービスへのリンクです。

url 属性の定義には、WSDL 拡張名前空間の 2 つの属性が組み込まれています。この wsdlx:interface 属性と wsdlx:binding 属性の 2 つがそれぞれ識別するのは、サービスの特定の WSDL 2.0 インターフェースおよびバインディングです。ツールはこのセマンティック情報を使用して、自動的にサービスを見つけます。この 2 つの属性を使用するためには、schema 要素に WSDL 拡張名前空間を指定します。また、書籍詳細情報サービスのインターフェースとバインディングを参照するため、対応する WSDL 2.0 記述の書籍詳細情報サービス名前空間も組み込んでください。

リスト 7 に、書籍リスト作成サービスの XML スキーマを記載します。書籍詳細情報サービスの記述は、「ダウンロード」セクションから入手することができます。

リスト 7. 書籍リスト作成サービスの XML スキーマ
<schema xmlns="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www.bookstore.org/booklist/xsd"
   xmlns:tns="http://www.bookstore.org/booklist/xsd"
   xmlns:booksvc="http://www.bookstore.org/book/wsdl"
   xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions"
   elementFormDefault="qualified">
  
  <element name="getBookList" type="tns:getBookListType">
  	<annotation>
  	  <documentation>
         The request element for the book list service.
  	  </documentation>
    </annotation>
  </element>
  
  <element name="bookList" type="tns:bookListType">
    <annotation>
      <documentation>
         The response element for the book list service.
      </documentation>
    </annotation>
  </element>
  
  <complexType name="getBookListType">
    <sequence>
      <element name="author" type="string" minOccurs="0" maxOccurs="unbounded"/>
      <element name="title" type="string" minOccurs="0" maxOccurs="1"/>
      <element name="publisher" type="string" minOccurs="0" maxOccurs="1"/>
      <element name="subject" type="string" minOccurs="0" maxOccurs="1"/>
      <element name="language" type="string" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="bookListType">
    <sequence>
      <element name="book" type="tns:bookType" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="bookType">
    <attribute name="title" type="string"/>
    <attribute name="url" type="anyURI" 
       wsdlx:interface="booksvc:BookInterface"
       wsdlx:binding="booksvc:BookHTTPBinding"/>
  </complexType>
</schema>

XML スキーマで宣言された入力要素と出力要素を参照するには、このスキーマを WSDL 文書にインポートします。スキーマのインポートには、types セクションのスキーマ import 要素を使用します (リスト 8 を参照)。また、インターフェース操作の input 要素と output 要素に含まれる getBookList および bookList 要素への参照を追加すること、書籍リスト XML スキーマの名前空間宣言を description 要素に追加することも忘れないでください。

リスト 8 に、完成した書籍リスト作成 REST Web サービスの WSDL 2.0 記述を記載します。このサービスおよび書籍詳細情報 REST Web サービスの記述は、「http://www.ibm.com/developerworks/jp/aboutdw/downloads/ダウンロード」セクションから入手してください。

リスト 8. 完成した書籍リスト作成 REST Web サービスの WSDL 2.0 記述
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
   targetNamespace="http://www.bookstore.org/booklist/wsdl"
   xmlns:tns="http://www.bookstore.org/booklist/wsdl"
   xmlns:whttp="http://www.w3.org/ns/wsdl/http"
   xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:msg="http://www.bookstore.org/booklist/xsd">
  <wsdl:documentation>
     This is a WSDL 2.0 description of a sample bookstore service
     listing for obtaining book information.
  </wsdl:documentation>

  <wsdl:types>
    <xs:import namespace="http://www.bookstore.org/booklist/xsd"
       schemaLocation="booklist.xsd"/>
  </wsdl:types>

  <wsdl:interface name="BookListInterface">
    <wsdl:operation name="getBookList"
       pattern="http://www.w3.org/ns/wsdl/in-out"
       style="http://www.w3.org/ns/wsdl/style/iri" 
       wsdlx:safe="true">
      <wsdl:documentation>
         This operation returns a list of books.
      </wsdl:documentation>
      <wsdl:input element="msg:getBookList"/>
      <wsdl:output element="msg:bookList"/>
    </wsdl:operation>
  </wsdl:interface>

  <wsdl:binding name="BookListHTTPBinding"
     type="http://www.w3.org/ns/wsdl/http"
     interface="tns:BookListInterface">
    <wsdl:documentation>
       The RESTful HTTP binding for the book list service.
    </wsdl:documentation>
    <wsdl:operation ref="tns:getBookList" whttp:method="GET"/>
  </wsdl:binding>

  <wsdl:service name="BookList" interface="tns:BookListInterface">
    <wsdl:documentation>
       The bookstore's book list service.
    </wsdl:documentation>
    <wsdl:endpoint name="BookListHTTPEndpoint"
       binding="tns:BookListHTTPBinding"
       address="http://www.bookstore.com/books/">
    </wsdl:endpoint>
  </wsdl:service>
</wsdl:description>

まとめ

この記事では、REST の概要、そして WSDL 2.0 の REST Web サービスではどのように HTTP と XML を使用して通信するのかを説明しました。アクション中心のアプリケーションとは異なり、RESTful なアプリケーションではリソースが中心となります。REST Web サービスをある形式に従って記述することの価値は、その記述をクライアントとサービス・プロバイダー間での正式な契約として使用できること、そしてツールのサポートにあります。このような REST Web サービスの記述をサポートするのが、WSDL 2.0 です。この記事では、WSDL 2.0 と XML スキーマを使った書籍リスト作成 REST Web サービスの記述をひと通り説明しました。

この記事で説明した書籍リスト作成サービスの WSDL 2.0 記述を作成する手順を参考に、独自の REST Web サービスの記述を作成してみてください。

謝辞

この記事をレビューして有益かつ詳細な意見を寄せてくれた Christopher Ferris、John Kaputin、Anne James の各氏に感謝します。


ダウンロード

内容ファイル名サイズ
bookstore Sample WSDL 2.0 descriptionsbookstore-sample.zip5KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

  • Java™ をベースとした WSDL 2.0 検証パーサー、Apache Woden をダウンロードしてください。
  • Java ベースの Web サービス・ランタイム向け Apache Axis2 をダウンロードしてください。この Web サービス・フレームワークでは、WSDL 2.0 をベースとした Web サービスを生成して実行することができます。
  • IBM ソフトウェアの試用版を使用して、次の開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=317251
ArticleTitle=WSDL 2.0 で REST Web サービスを記述する
publish-date=05292008