重要な注意

この邦訳は、私 SUGAI, Manabu が私的な勉強のために作成したものです。訳文の正確さは保証できません。この翻訳には誤りが含まれます。この点をご理解頂いた上でご利用下さい。本邦訳は依然改稿中であり、決定稿ではありません。

正式なものはあくまでも W3C の英語版だけですので、 特に技術的な利用においては、 W3C の原典を参照してください。

<<BACK | last modified: 24th/Dec./2007 | Translated by SUGAI, Manabu.


W3C

Web Services Description Language (WSDL) Version 2.0 Part 0: Primer

W3C勧告 2007年6月26日

本邦訳の基にした版:
http://www.w3.org/TR/2007/REC-wsdl20-primer-20070626
最新版:
http://www.w3.org/TR/wsdl20-primer
一つ前の版:
http://www.w3.org/TR/2007/PR-wsdl20-primer-20070523
編集者:
David Booth, W3C Fellow / Hewlett-Packard
Canyang Kevin Liu, SAP Labs

本文書の正誤表を参照されたい。規範的修正を含むことがある。

本文書は他にも以下の非規範的フォーマットで入手可能である: PDF, PostScript, XML, and plain text

また、翻訳版も参照可能である。


概要 (Abstract)

本文書は、WSDL 2.0仕様 (Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language [WSDL 2.0 Core], Web Services Description Language (WSDL) Version 2.0 Part 2: Adjuncts [WSDL 2.0 Adjuncts])の仲間である。 この言語の主な機能に対する技術的導入を、より簡便に少なくしたいと思う読者向けに意図されている。

この入門は、WSDL 2.0利用の出発点となることだけを意図されており、この言語の全ての機能を記述しているわけではない。読者は、より多くの洗練された機能やテクニックを使いこなそうと思うのであれば、WSDL 2.0仕様を調べることが期待されている。

最後に、本入門は、非規範的である。WSDL 2.0の要求事項と禁止事項に関するあらゆる具体的な疑問については、WSDL 2.0仕様を参照すべきである。

本文書のステータス (Status of this Document)

本セクションは本文書の原版が公開された当時のステータスを記述している。他の文書が本文書に取って代わるかもしれない。現在W3Cで公開されている文書の一覧および、本技術文書の最新版は、http://www.w3.org/TR/のW3C technical reports indexで得られる。

これは、W3Cメンバおよび他の利害関係団体によるレビューを経た、Web Services Description Language (WSDL) Version 2.0 Part 0: Primerに対するW3C勧告である。 Web Services Description作業部会によって、W3C Web Services Activityの一部として作成された。

本文書に対するコメントは、公開メーリングリストpublic-ws-desc-comments@w3.org (public archive)へ送っていただきたい。

この作業部会では、実装レポートに沿ったテストスィートをリリースしている。 本文書の前の版に対する差分を目立たせた版が入手可能である。

本文書は、W3Cメンバ、ソフトウェア開発者、他のW3Cグループおよび関係団体によってレビューされ、ディレクタによってW3C勧告として承認された。 これは安定的な文書であり、他の文書で引用したり、参照資料として用いても良い。勧告策定におけるW3Cの役割は、その仕様に対する関心を引き出し、広範な展開を促進することである。このことによって、Webの機能性と相互運用性を高めることになる。

本文書は、改定されたW3C特許ポリシー移行手続きによる24 January 2002 CPP (Current Patent Practice)で管理されている。 W3Cでは、各グループの要素成果物と関連して作成された公的な特許のリストをメンテナンスしている; それらのページは特許の公開に対する指示も含んでいる。この仕様に関するEssential Claim(s)を含んでいる特許に関する知識を持っていると主張する者は、W3C特許ポリシーの第6章に従い、情報を公開しなければならない。

目次 (Table of Contents)

1. 導入
    1.1 前提条件
    1.2 本入門の構成
    1.3 URIとIRIの利用
    1.4 表記上の慣習
2. WSDL 2.0の基本
    2.1 始めに: The GreatH Hotelの例
        2.1.1 シナリオ例: The GreatH Hotel予約Service
        2.1.2 WSDL 2.0 ターゲット名前空間の定義
            2.1.2.1 例の説明
        2.1.3 メッセージ型の定義
            2.1.3.1 例の説明
        2.1.4 インタフェース定義
            2.1.4.1 例の説明
        2.1.5 バインディング定義
            2.1.5.1 例の説明
        2.1.6 サービス定義
            2.1.6.1 例の説明
        2.1.7 サービスの文書化
            2.1.7.1 例の説明
    2.2 WSDL 2.0インフォセット、スキーマ、コンポネント・モデル
        2.2.1 WSDL 2.0インフォセット
        2.2.2 WSDL 2.0スキーマ
            2.2.2.1 WSDL 2.要素順序
        2.2.3 WSDL 2.0コンポネント・モデル
            2.2.3.1 WSDL 2.0インポートおよびインクルード
    2.3 メッセージ・タイプの詳細
        2.3.1 インラインXMLスキーマ
        2.3.2 XMLスキーマのインポート
        2.3.3 インポートおよびインクルードのメカニズムの要約
    2.4 インタフェースの詳細
        2.4.1 インタフェース・シンタックス
        2.4.2 インタフェースの継承
        2.4.3 インタフェースのフォルト
        2.4.4 インタフェースのオペレーション
            2.4.4.1 オペレーションの属性
            2.4.4.2 メッセージ参照のオペレーション
                2.4.4.2.1 messageLabel属性
                2.4.4.2.2 element属性
                2.4.4.2.3 Multiple infault or outfault Elements
            2.4.4.3 Understanding Message Exchange Patterns (MEPs)
    2.5 バインディングの詳細
        2.5.1 Syntax Summary for Bindings
        2.5.2 Reusable Bindings
        2.5.3 Binding Faults
        2.5.4 Binding Operations
        2.5.5 The SOAP Binding Extension
            2.5.5.1 Explanation of Example
        2.5.6 The HTTP Binding Extension
            2.5.6.1 例の説明 (Explanation of Example)
        2.5.7 HTTP GET Versus POST: Which to Use?
3. 発展的話題I: インポート・メカニズム
    3.1 Importing WSDL
    3.2 Importing Schemas
        3.2.1 Schemas in Imported Documents
        3.2.2 Multiple Inline Schemas in One Document
        3.2.3 The schemaLocation Attribute
            3.2.3.1 Using the id Attribute to Identify Inline Schemas
4. 発展的話題II: 拡張可能性および定義済み拡張
    4.1 Extensibility
        4.1.1 Optional Versus Required Extensions
    4.2 Defining New MEPs
        4.2.1 Confirmed Challenge
    4.3 RPC Style
5. 発展的話題III: その他
    5.1 Enabling Easy Message Dispatch
    5.2 Web Service Versioning
        5.2.1 Compatible Evolution
        5.2.2 Big Bang
        5.2.3 Evolving a Service
        5.2.4 Combined Approaches
        5.2.5 Examples of Versioning and Extending a Service
            5.2.5.1 Additional Optional Elements Added in Content
            5.2.5.2 Additional Optional Elements Added to a Header
            5.2.5.3 Additional Mandatory Elements in Content
            5.2.5.4 Additional Optional Operation Added to Interface
            5.2.5.5 Additional Mandatory Operation Added to Interface
            5.2.5.6 Indicating Incompatibility by Changing the Endpoint URI
            5.2.5.7 Indicating Incompatibility by Changing the SOAP Action
            5.2.5.8 Indicating Incompatibility by Changing the Element Content
    5.3 他のWebサービスを参照するWebサービスメッセージの記述
        5.3.1 予約詳細Webサービス
        5.3.2 予約リストWebサービス
        5.3.3 HTTP転送を用いた予約詳細Webサービス
        5.3.4 HTTP GETを用いた予約リストWebサービス
    5.4 同一サービスに対する複数のインタフェース
    5.5 RDFとセマンティックWebに対するマッピング
        5.5.1 WSDL 2.0におけるRDF表現
    5.6 URIsに関する補足
        5.6.1 XML NamespacesとSchemaのLocations
        5.6.2 相対URIs
        5.6.3 一時URIsの生成
6. リファレンス
    6.1 規範的リファレンス
    6.2 非規範的リファレンス

補遺

A. 謝辞 (非規範的)


1. 導入 (Introduction)

1.1 前提条件 (Prerequisites)

本入門では、読者は次の前提知識を持っていることを想定する:

  • XML(Extensible Markup Language (XML) 1.0 [XML 1.0]とXML Information Set [XML Information Set])およびXML名前空間 (Namespaces in XML [XML Namespaces])についての習熟;

  • XMLスキーマ(XML Schema Part 1: Structures [XML Schema Structures] XML Schema Part 2: Datatypes [XML Schema Datatypes])についてのある程度の習熟;

  • Webサービス、クライアント、Webサービス記述の目的と機能などの、Webサービスのコンセプトについての習熟(基本的なWebサービスのコンセプトに関する説明は、次の場所を参照: Web Services Architecture [WS Architecture] Section 1.4およびWeb Services Glossary [WS Glossary] glossary。しかしながら、Web Services Architectureの文書では、本入門における「client」、「Web service」の代わりに、より正確な用語である「requester agent」、「provider agent」が遣われていることに注意して欲しい。)

WSDLに関する事前の経験は、まったくないことを想定している。

1.2 本入門の構成 (Structure of this Primer)

第2セクションでは、ホテルの予約サービスを含む仮説的なユースケースから始める。ここでは、このサービスを記述するWSDL 2.0の簡単な例の開発を通して、ステプ・バイ・ステップで進める:

  • types要素は、このサービスが送受信するメッセージの種類を記述する。

  • interface要素は、このWebサービスが提供する抽象機能がなんであるのかを記述する。

  • binding要素は、このサービスにどのようにアクセスするかを記述する。

  • service要素は、このサービスにどこでアクセスするかを記述する。

例を提示した後は、WSDL 2.0のインフォセット、スキーマ、コンポネントモデルの導入へ移る。 ここでは、メッセージタイプ、インタフェース、バインディング、サービスを定義するための、より詳細な情報を提供する。

第3セクションでは、極めて詳細なWSDL 2.0インポーティング・メカニズムを説明する。

第4セクションでは、WSDL 2.0の拡張可能性および、さまざまな定義済み拡張について話題にする。

第5セクションでは、さまざまな話題に触れる。中には、WSDL 2.0のスコープから外れるものもあるが、WSDL 2.0文書記述やWSDL 2.0仕様の実装に役立つであろう、有意義なバックグラウンドとベスト・プラクティスのガイダンスを提供できるだろう。

1.3 URIとIRIの利用 (Use of URIs and IRIs)

WSDL 2.0のコア仕様は、Internationalized Resource Identifiers、すなわちIRIs [IETF RFC 3987]をサポートしている。 IRIsはURIsのスーパーセットで、国際化 (internationalization)サポートが追加されている。 URIのシンタックス[IETF RFC 3986]では、英数字の大文字と小文字、欧州の数字、および幾つかの記号を含む、僅かな文字の集合だけを許可している。IRIsでは、言語スクリプトのより幅広い文字の利用を許している。

単純化のために、本入門全体を通して、例ではURIsだけを使っている。 もし、IRIsの利用に関してもっと学びたいと思うのであれば、W3C Internationalization Activityに用意されているペーパーを読むことを勧める。

1.4 表記の規則 (Notational Conventions)

本文書では、幾つかのXML名前空間を用いている。それらのうちの幾つかのものは標準で定義されており、幾つかはアプリケーション固有である。 名前空間を名付ける一般的形式"http://greath.example.com/..."が表現するのは、アプリケーションまたは文脈に依存したURIs [IETF RFC 3986]である。また、名前空間の接頭辞の選択はいかなるものであれ恣意的であり、意味的な重要性はないことに注意して欲しい([XML Information Set]参照)。

[WSDL 2.0 Core]におけるXMLシンタックス・サマリの規則に従って、この入門でも、WSDL 2.0文書のXML文法を記述するために、非公式なシンタックスを利用する:

  • シンタックスはXMLの実例として提示するが、値は値の代わりに値の型を指す。

  • 次のような文字が要素や属性の後ろに追加される:"?"(0か1)、"*"(0以上)、"+"(1以上)。

  • 要素名が"…"で終了しているものは、文脈上無関係な要素/属性が省略されていることを指す。

2. WSDL 2.0の基礎 (WSDL 2.0 Basics)

2.1 始めに: GreatHホテルの例 (Getting Started: The GreatH Hotel Example)

このセクションでは、架空のホテル予約サービスの記述を通して、WSDL 2.0で使われる基本的なコンセプトを導入する。 我々は単純なシナリオから始めて、後で、より高度なWSDL 2.0機能の利用方法を説明するために、更なる要求を追加する。

2.1.1 シナリオ例: GreatHホテル予約サービス (例Scenario: The GreatH Hotel Reservation Service)

ホテルGreatH(架空のホテル)は、遠隔の島にある。 従来は、空き室予約の提供は、ファックスと電話に頼っている。 GreatHホテルの設備と価格が競合相手の提示するものより良かったとしても、その競合相手の方がGreatHよりも多くの顧客を得ていることにHreatHでは気付く。 調査の後で、GreatHは、これが競争相手が旅行代理店予約システムが直接インターネット上で部屋を予約することを許すWebサービスを提供するからであることを理解する。 今回、GreatHは我々を雇い、次の機能を持つ予約Webサービスを構築することにする:

  • CheckAvailability。空室があるか確認するために、クライアントはチェックイン予定日、チェックアウト予定日、ルームタイプを指定しなければならない。このWebサービスは、そのような部屋が予約可能であれば宿泊料金(USドルの浮動小数点数)を返し、もしなければ宿泊料金として0を返す。もし、何れかの入力データが不正であれば、このサービスはエラーを返さなければならない。つまり、このサービスは、checkAvailabilityメッセージを受け取り、checkAvailabilityResponseまたはinvalidDataFaultメッセージを返す。

  • MakeReservation。実際に予約するために、クライアントは、名前、住所、クレジット・カード情報を提供しなければならない。そして、予約が成功したら、サービスは予約確認番号を返す。サービスは、クレジットカード番号、または他のデータ・フィールドが不正であれば、エラーメッセージを返す。つまり、サービスはmakeReservationメッセージを受け取って、makeReservationResponseまたはinvalidCreditCardFaultメッセージを返す。

我々は、後で、トランザクションと安全な転送をサポートする完全なシステムを構築する必要があることを知っているが、最初は、最小の機能だけを実装することにする。実際、我々の最初の例を単純にするために、CheckAvailabilityオペレーションだけを実装することにする。

後続の幾つかのセクションでは、要求されたWebサービスを記述するためのWSDL 2.0文書を開発するプロセスを通して、ステップ・バイ・ステップで進めていく。しかしながら、完全な例を見るまで待てない方々のために、これから作成されるWSDL 2.0文書をここに挙げておく。

例2-1. GreatH WebサービスのためのWSDL 2.0文書(最初の例)

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
    xmlns:wsoap= "http://www.w3.org/ns/wsdl/soap"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsdlx= "http://www.w3.org/ns/wsdl-extensions">

  <documentation>
    この文書はGreatHサービスについて記述している。
    このサービスを利用するための、追加のアプリケーションレベルの要求 --
    WSDL 2.0で記述できる範囲以上のもの -- は、次のURIで得られる:
    http://greath.example.com/2004/reservation-documentation.html
  </documentation>

  <types>
    <xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://greath.example.com/2004/schemas/resSvc"
        xmlns="http://greath.example.com/2004/schemas/resSvc">

      <xs:element name="checkAvailability" type="tCheckAvailability"/>    
      <xs:complexType name="tCheckAvailability">     
        <xs:sequence>      
          <xs:element  name="checkInDate" type="xs:date"/>      
          <xs:element  name="checkOutDate" type="xs:date"/>      
          <xs:element  name="roomType" type="xs:string"/>      
        </xs:sequence>     
      </xs:complexType>   
            
      <xs:element name="checkAvailabilityResponse" type="xs:double"/>    
    
      <xs:element name="invalidDataError" type="xs:string"/>    

    </xs:schema>    
  </types>
  
  <interface  name = "reservationInterface" >

    <fault name = "invalidDataFault"
            element = "ghns:invalidDataError"/> 
   
    <operation name="opCheckAvailability" 
            pattern="http://www.w3.org/ns/wsdl/in-out" 
            style="http://www.w3.org/ns/wsdl/style/iri"
            wsdlx:safe = "true">
        <input messageLabel="In" 
              element="ghns:checkAvailability" />
        <output messageLabel="Out" 
              element="ghns:checkAvailabilityResponse" />
        <outfault ref="tns:invalidDataFault" messageLabel="Out"/>
    </operation>

  </interface>

  <binding name="reservationSOAPBinding" 
          interface="tns:reservationInterface"
          type="http://www.w3.org/ns/wsdl/soap"
          wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
 
    <fault ref="tns:invalidDataFault" 
      wsoap:code="soap:Sender"/>

    <operation ref="tns:opCheckAvailability" 
      wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>

  </binding>

  <service name="reservationService" 
       interface="tns:reservationInterface">

     <endpoint name="reservationEndpoint" 
               binding="tns:reservationSOAPBinding"
               address ="http://greath.example.com/2004/reservation"/>
        
  </service>

</description>

2.1.2 WSDL 2.0のターゲット名前空間の定義 (Defining a WSDL 2.0 Target Namespace)

我々のWSDL 2.0文書を書く前に、我々はそのためのWSDL 2.0ターゲット名前空間URIを決定する必要がある。WSDL 2.0のターゲット名前空間は、XMLスキーマのターゲット名前空間に似ている。 我々のWSDL 2.0文書で定義される、インタフェース、バインディング、およびサービスの名前は、WSDL 2.0ターゲット名前空間と結び付けられる。従って、別のWSDL 2.0ターゲット名前空間の類似した名前とは区別できる。(このことは、WSDL 2.0の、インポートやインタフェース継承メカニズムを使うときに、重要となる。)

WSDL 2.0ターゲット名前空間の値は、絶対URIでなければならない。なお、そのWSDL 2.0ターゲット名前空間を記述に使うWebサービスを記述するWSDL 2.0文書を参照可能 (dereferenceable)であるべきである。例えば、GreatHのオーナーは、このURIからそのWSDL 2.0文書を得られるようにしておくべきである。(そして、もしWSDL 2.0記述が複数の文書に分割されているのであれば、WSDL 2.0ターゲット名前空間はサービス記述に必要な全てのWSDL 2.0文書をインクルードするマスター文書を解決すべきである。)しかし、この参照可能 (dereferenceable)なURIに対する絶対的な要求はなく、WSDL 2.0処理系はそれが参照可能 (dereferenceable)であることに頼ってはならない。

この勧告は循環的に聞こえるかもしれないが、クライアントはWSDL 2.0文書をどこから得ても良いことを記憶しておいて欲しい -- そこは正規のソースである必要はない。しかし、WSDL 2.0ターゲット名前空間URIを参照 (dereferencing)することで、ユーザは正規なバージョンを得られるべきである。GreatHがそのサービスのオーナーとなるので、WSDL 2.0ターゲット名前空間URIはGreatH Webサイトか、その制御下にある場所を参照すべきである。

一度、我々がWSDL 2.0ターゲット名前空間URIを決定したら、我々のWSDL 2.0文書は、次の空のシェルから始めることができる。

例2-2. 最初の空のWSDL 2.0文書

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    . . . >

  . . .
</description>
2.1.2.1 例の説明 (Explanation of Example)
<description

全てのWSDL 2.0文書は、最上位要素としてdescription要素を持つ。 これは単に、そのWSDL 2.0文書の残りの部分のコンテナとして働き、その文書を通して利用される名前空間の宣言に使われる。

xmlns="http://www.w3.org/ns/wsdl"

これがWSDL 2.0自身のXML名前空間である。我々は、これに対する接頭辞を定義しないことによって、この例のデフォルト名前空間として割り当てた。 言い換えると、この例に現れる接頭辞のないあらゆる要素は、WSDL 2.0要素であると期待される(例えばdescription要素。)

targetNamespace="http://greath.example.com/2004/wsdl/resSvc"

ここでは、先に述べたGreatH予約サービスのために我々が選択したWSDL 2.0ターゲット名前空間を定義している。 これが実際のXML名前空間宣言ではないことに注意して欲しい。 より正確には、これはXML Schemaターゲット名前空間と類似した目的を持つWSDL 2.0属性である。

xmlns:tns="http://greath.example.com/2004/wsdl/resSvc"

これが、我々のGreatHサービス記述で使うための実際のXML名前空間宣言である。 このURIが、先ほどtargetNamespace属性の値として指定したものと同じであることに注意して欲しい。 こうすることによって、我々は後に、GreatHサービスのWSDL 2.0ターゲット名前空間を参照するために、Qnameの中でtns:接頭辞を使えるようになる。(QNameに関する詳細は、[XML Namespaces]第3セクションQualified Namesを参照。)

これで、我々はGreatHサービスを記述し始めることができる。

2.1.3 メッセージ型の定義 (Defining Message Types)

我々は、GreatHサービスがメッセージを送受信することを知っている。 サービスの記述の良い出発点は、サービスが用いるメッセージ型を定義することである。 そのために我々はXML Schemaを用いる。WSDL 2.0処理系は最低限XML Schemaをサポートしているものであるからである。 しかしながら、WSDL 2.0は他のスキーマ記述言語の利用を禁止しているわけではない。

WSDL 2.0では、メッセージ型をWSDL 2.0文書内で直接定義できる。定義場所はdescription要素の子要素であるtypes要素内である。(あとで我々は、XML Schemaのimportメカニズムを使って、いかにして別々の文書で型定義を提供できるかを見ることになる。) 次のスキーマでは、我々が必要なcheckAvailabilitycheckAvailabilityResponseおよびinvalidDataErrorメッセージ型を定義している。

WSDL 2.0では、全ての正常およびフォルト・メッセージの型は、最上位レベルで単一の要素として定義されていなければならない(もちろん、各々の要素はその内部に任意の量の内部構造を持ってよい)。 つまり、メッセージ型は、複数の要素の連続や他の複合的な型から直接構成されてはならない。

例2-3. GreatHメッセージ型

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
    . . . >

  ...

  <types>
    <xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://greath.example.com/2004/schemas/resSvc"
        xmlns="http://greath.example.com/2004/schemas/resSvc">

      <xs:element name="checkAvailability" type="tCheckAvailability"/>    
      <xs:complexType name="tCheckAvailability">     
        <xs:sequence>      
          <xs:element  name="checkInDate" type="xs:date"/>      
          <xs:element  name="checkOutDate" type="xs:date"/>      
          <xs:element  name="roomType" type="xs:string"/>      
        </xs:sequence>     
      </xs:complexType>   
            
      <xs:element name="checkAvailabilityResponse" type="xs:double"/>    
    
      <xs:element name="invalidDataError" type="xs:string"/>    

    </xs:schema>    
  </types>
  . . .
</description>
2.1.3.1 例の説明 (Explanation of Example)
xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"

我々は別の名前空間宣言を追加した。ghns名前空間接頭辞は、(あとでインタフェースを定義するときに)我々のメッセージ型を定義するXML Schemaターゲット名前空間を参照できるようにする。つまり、我々が指定したURIは、XML Schema型のターゲット名前空間として定義するURI(次を参照)と同じでなければならない -- WSDL 2.0文書自身のターゲット名前空間ではない

targetNamespace="http://greath.example.com/2004/schemas/resSvc"

これがXML Schemaターゲット名前空間である。これは、GreatH予約サービスのために作ったものである。checkAvailabilitycheckAvailabilityResponseおよびinvalidDataError要素名は、このXML Schemaターゲット名前空間と結び付けられる。

checkAvailabilitycheckAvailabilityResponseおよびinvalidDataError

これらは、我々が用いるメッセージ型である。先ほど説明したように、これらがXML要素となるように定義されていることに注意して欲しい。

我々は幾つかの型を定義してきたが、我々はまだどれがWebサービスで使われるメッセージ型なのかを示していない。次の節ではそれをやってみよう。

2.1.4 インタフェースの定義 (Defining an Interface)

WSDL 2.0では、Webサービスの抽象機能の記述を、その機能が提供される具象的な方法と場所の詳細から分離できる。 こうして分離することによって、Webサービスとそれを記述するWSDL 2.0文書のライフサイクルにおいて、異なるレベルの再利用性と配布作業を促進する。

WSDL 2.0 interfaceは、抽象オペレーションの集合として、Webサービスの抽象インタフェースを定義し、各々のオペレーションは、クライアントとサービスの間の単純なやりとりを表現する。 各々のオペレーションが指定するのは、サービスがそのオペレーションの一部として送受信できるメッセージの型である。 各々のオペレーションは、メッセージ交換のパターンも指定する。このパターンは、関連するメッセージがパーティー間で転送されるシーケンスを示している。 例えば、in-outパターン(WSDL 2.0定義済み拡張 [WSDL 2.0 Adjuncts]第2.2.3節In-Out参照)は、もしクライアントがメッセージinをサービスに送ったら、サービスはクライアントにoutをメッセージとして送り返すか(正常ケースの場合)、フォルト・メッセージをクライアントに送り返す(異常ケースの場合)ことを示している。 我々は、より詳細なメッセージ交換パターンを、2.4.4.3 メッセージ交換パターン(Message Exchange Patterns (MEPs))の理解で説明する。

GreatHサービスのために、我々は(まず)単一のオペレーションopCheckAvailabilityを含んだインタフェースを定義する。これは、typesの節で定義したcheckAvailabilitycheckAvailabilityResponseメッセージ型を用いる。 我々はこのオペレーションのためにin-outパターンを用いる。これが、単純な応答-要求型のやり取りを表現する最も自然なものだからである。我々はこれの代わりに(例えば)、in-onlyout-onlyを用いた別々のオペレーションを定義することもできる(WSDL 2.0定義済み拡張 [WSDL 2.0 Adjuncts]第2.2.1節In-Onlyと第2.2.5節Out-Only参照)。しかし、それはクライアントにとっては複雑なだけの作業になる可能性がある。クライアント開発者に、応答-要求の組として二つのオペレーションを一緒に使うべきであることを、別途指示しなければならなくなるだろうからだ。

正常な入力と出力のメッセージに加えて、我々はエラー・イベントで使いたいフォルト・メッセージも指定する必要がある。WSDL 2.0は、オペレーションを横断してフォルトの再利用を促進するために、フォルト・メッセージはinterface要素内で宣言できる。もしフォルトが発生したら、そのオペレーションのメッセージ交換パターンで指定された、どのメッセージ・シーケンスであっても、終了する。

例2-4. GreatHインタフェース定義

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
    . . . 
    xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions">

  . . .
  <types>
        ...
  </types>
  
  <interface  name = "reservationInterface" >

    <fault name = "invalidDataFault"
            element = "ghns:invalidDataError"/> 
   
    <operation name="opCheckAvailability" 
            pattern="http://www.w3.org/ns/wsdl/in-out"
            style="http://www.w3.org/ns/wsdl/style/iri"
            wsdlx:safe = "true">
        <input messageLabel="In" 
              element="ghns:checkAvailability" />
        <output messageLabel="Out" 
              element="ghns:checkAvailabilityResponse" />
        <outfault ref="tns:invalidDataFault" messageLabel="Out"/>
    </operation>

  </interface>

  . . .
</description>
2.1.4.1 例の説明 (Explanation of Example)
<interface name = "reservationInterface">

インタフェースは、description要素の直接の内側で宣言される。 この例では、我々はインタフェースを一つだけ宣言しているが、一般的には、WSDL 2.0文書は一つ以上のインタフェースを宣言してよい。 つまり、各々のインタフェースには、このWSDL 2.0名前空間で定義されるインタフェースの集合のなかで一意になる名前を与えなければならない。 インタフェース名は、スペースやコロン (":")を含んではならないトークンである。

<fault name ="invalidDataFault"

name属性は、このフォルト (fault)の名前を定義する。 この名前は、オペレーションが定義されるときに、望んでいるフォルトを名前で参照できるようにするために要求される。 フォルト名は、インタフェース内で一意であれば良い。

element ="ghns:invalidDataError"/>

element属性が指定するのは、先にtypesの節で定義した、フォルト・メッセージのスキーマタイプである。

<operation name="opCheckAvailability"

name属性が定義するのは、このオペレーションの名前である。 こうすることによって、後で、バインディングが定義されるときに、参照可能になる。 また、オペレーション名は、インタフェース内で一意でなければならない。 (WSDL 2.0では、オペレーション名とフォルト名に対して、別々のシンボル空間を用いるので、オペレーション名"foo"はフォルト名"foo"とは区別される。)

pattern="http://www.w3.org/ns/wsdl/in-out"

この行が指定するのは、このオペレーションが、先に説明したin-outパターンを使うことである。 WSDL 2.0では、誰かが将来、新しいパターンを定義できるようにするために、識別子がグローバルに重複しない(unambiguous)ことを確保できるよう、メッセージ交換パターンを識別するためにURIsを用いる。 (しかしながら、誰かが新しいパターンを定義し、それを識別するためのURIを作ったからといって、他のWSDL 2.0処理系が自動的にそのパターンを認識、あるいは解釈できるようになるわけではない。他の拡張と同様、それを認識して解釈しようとする処理系でだけ利用できる。)

style="http://www.w3.org/ns/wsdl/style/iri"

この行は、このサービスの入力メッセージを定義するXMLスキーマが、IRI Styleで指定される規則の集合に従っていることを示している。IRI Styleは、そのメッセージが、IRIとしてシリアライズされることを保証している。

wsdlx:safe="true" >

この行は、このオペレーションが、どういう形であれクライアントに責務を負わせないことを示している。つまり、クライアントは、そのサービスが責務を課すかもしれないこと(例えば、何かの購入に同意すること)を恐れることなく、そのオペレーションを安全に呼び出せる。このことは、2.4.4 インタフェース・オペレーションで更に説明する。

<input messageLabel="In"

input要素は入力メッセージを指定する。我々が既にそのオペレーションが利用するメッセージ交換パターンを指定していても、メッセージ・パターンが表現するのはメッセージ・シーケンスのテンプレートであり、理論的には、複数の入力および/または出力メッセージで構成されるかもしれない。 従って、我々は、この特定の入力メッセージが表現するのが、そのパターンにおいて可能性のある入力メッセージのうちのどれであるかも、示さなければならない。 これがmessageLabel属性の目的である。 我々が選んだin-outパターンには唯一つの入力メッセージしかないので、この場合は当然の結論になる:我々は単に、メッセージ・ラベルに"In"を埋めるだけである。このラベル"In"は、in-outパターンを説明したWSDL 2.0定義済み拡張 [WSDL 2.0 Adjuncts]第2.2.3節In-Outで定義されている。 しかしながら、もし新しいパターンが複数の入力メッセージを含むように定義されていれば、そのパターンの異なるメッセージは異なるラベルを使って区別されることになるだろう。

element="ghns:checkAvailability"/>

ここでは、この入力メッセージに対するメッセージ型を指定している。typesの節で定義済みのとおりである。

<output messageLabel="Out" . . .

これは入力メッセージの定義と同様である。

<outfault ref="tns:invalidDataFault" messageLabel="Out"/>

ここでは、フォルト出力をこのオペレーションと結び付けている。 フォルトは、正常メッセージとは若干異なって宣言される。 ref属性が参照するのは、そのインタフェースで既に定義済みのフォルトの名前である -- メッセージスキーマタイプを直接指定するわけではない。 メッセージ交換パターンは、一般的には、複数メッセージのシーケンスを含むので、フォルトはそのメッセージシーケンスのさまざまな場所で発生する可能性がある。 異なるフォルトを、そのシーケンス内の各々の許されたポイントに結び付けたいときは、この特定のフォルトに対する望むポイントを示すために、messageLabelが使われる。 パターンによって、このフォルトのトリガとなるメッセージと、フォルトが置換するメッセージのどちらかを指定することによって、間接的に行う。 (幾つかのパターンがmessage-triggers-fault規則を利用している;他のものはfault-replaces-message規則を利用している。WSDL 2.0定義済み拡張 [WSDL 2.0 Adjuncts]第2.1.2節メッセージによるフォルトの起動および第2.1.1節フォルトによるメッセージの置換を参照。)

ここまでで、我々は、GreatHサービスに対する抽象インタフェースを定義した。それに対するバインディングを定義する準備ができた。

2.1.5 バインディングの定義 (Defining a Binding)

我々は、どんな抽象メッセージがGreatHサービスで交換できるかを指定してきたが、まだどのようにそれらのメッセージが交換されるかを指定していない。これがバインディングの目的である。 バインディングが指定するのは、そのサービスに対する具体的なメッセージ・フォーマットと転送プロトコルの詳細であり、そのインタフェース内のあらゆるオペレーションとフォルトに対して、そのような詳細を提供しなければならない。

一般的な場合では、各々のオペレーションとフォルトに対する詳細のバインディングは、次の例のように、binding要素内のoperation要素とfault要素を使って指定される。 しかしながら、ある場合には、情報提供のためのデフォルト規則(指定を省略したときの規則)を使うこともできる。 例えば、WSDL 2.0 SOAPバインディング拡張では、オペレーションに対する幾つかのデフォルト規則を定義している。(Web Services Description Language (WSDL) Version 2.0 Part 2: Adjuncts [WSDL 2.0 Adjuncts], デフォルト・バインディング規則参照。)

新しい種類のメッセージ・フォーマットと転送プロトコルを含めるために、バインディングは、WSDL 2.0オープン内容モデルによる、WSDL 2.0の拡張を利用して定義されている。 (拡張可能性に対する更なる情報は4.1拡張性参照。) WSDL 2.0 Part 2 [WSDL 2.0 Adjuncts]は、バインディング拡張を、SOAP 1.2 [SOAP 1.2 Part 1: Messaging Framework]とHTTP 1.1 [IETF RFC 2616]に対する、定義済み拡張として定義する。SOAP 1.2やHTTP 1.1バインディングがWSDL 2.0文書で簡単に定義できるようにするためである。 (任意の拡張に対してと同様に、他のWSDL 2.0処理系は、新しい構造については、利用するものについてだけ、認識するだろう。)

GreatHサービスのために我々は、次に示すとおり、具体的なメッセージ・フォーマットとしてSOAP 1.2、その下層の転送プロトコルとしてHTTPを利用する。

例2-5. GreatHバインディング定義

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
    xmlns:wsoap= "http://www.w3.org/ns/wsdl/soap"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  . . .

  <types>
    . . .
  </types>
  
  <interface  name = "reservationInterface" >
        ...
  </interface>

  <binding name="reservationSOAPBinding" 
          interface="tns:reservationInterface"
          type="http://www.w3.org/ns/wsdl/soap"
          wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">

    <operation ref="tns:opCheckAvailability" 
      wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
  
    <fault ref="tns:invalidDataFault" 
      wsoap:code="soap:Sender"/>

  </binding>

  . . .
</description>
2.1.5.1 例の説明 (Explanation of Example)
xmlns:wsoap="http://www.w3.org/ns/wsdl/soap"

我々は、二つの名前空間宣言を追加した。一つは、WSDL 2.0 Part 3 [SOAP 1.2 Part 1: Messaging Framework]で定義されているSOAP 1.2バインディング拡張の名前空間である。そこでは、接頭辞wsoap:を持つ要素と属性の構造が定義されている。

xmlns:soap="http://www.w3.org/2003/05/soap-envelope"

この名前空間は、SOAP 1.2仕様自身で定義されている。 SOAP 1.2仕様では、特定のコンセプトを明確に識別する、この名前空間内の特定の用語を定義している。 つまり、それらの用語の一つを参照する必要があるときは、soap:接頭辞を利用することになる。

<binding name="reservationSOAPBinding"

バインディングは、description要素の直接的な内側で宣言する。 name属性が定義するのは、このバインディングの名前である。 各々の名前は、WSDL 2.0ターゲット名前空間内の全てのバインディングを通して一意でなければならず、あとで、このバインディングを参照するサービス・エンドポイントを定義するときに利用する。 WSDL 2.0では、インタフェース、バインディング、サービスのために、別々のシンボル空間を利用するので、インタフェース"foo"と、バインディング"foo"とサービス"foo"は区別される。

interface="tns:reservationInterface"

これは、我々が指定するメッセージ・フォーマットと転送プロトコルに対するインタフェース名である。 2.5 バインディングの詳細で議論されているように、interface属性を省略することで、再利用可能なバインディングを定義することが可能になる。 また、tns:接頭辞を利用していることにも注意して欲しい。この接頭辞は、このWSDL 2.0文書に対する定義済みのWSDL 2.0ターゲット名前空間を参照している。この場合は、tns:接頭辞を指定しなければならないことが馬鹿らしく思えるかもしれないが、3.1 WSDLのインポートで、WSDL 2.0のインポーティング・メカニズムが、異なるWSDL 2.0ターゲット名前空間で定義されたコンポネントを、どのように結合できるかを見ることになる。

type="http://www.w3.org/ns/wsdl/soap"

これは、利用する具体的メッセージフォーマットの種類を指定する。この場合はSOAP1.2である。

wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"

この属性は、WSDL 2.0のSOAPバインディング拡張に固有の属性である(そのため、wsoap:接頭辞を使っている)。 これは、下層で利用されるべき転送プロトコルを指定する。この場合はHTTPである。

<operation ref="tns:opCheckAvailability"

これは新しいオペレーションを定義しているわけではない;正しくは、定義済みのopCheckAvailabilityオペレーションを、そのバインディングの詳細を指定するために、参照している。 この要素は、代わりにデフォルト規則が必要な情報を提供するために使えるのであれば、省略することができる。(WSDL 2.0 Part 2 [WSDL 2.0 Adjuncts]第4.3節Default Binding RulesのSOAPバインディング拡張を参照。)

wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response">

この属性も、WSDL 2.0のSOAPバインディング拡張に固有である。 これは、opCheckAvailabilityオペレーションが定義されたときに指定された、抽象WSDL 2.0メッセージ交換パターン(in-out)を実装するために使われるSOAPメッセージ交換パターン (MEP)を指定する

下層の転送プロトコルにHTTPが使われるときは(この例の場合)、wsoap:mep属性で下層のHTTPメソッドとしてGETとPOSTの何れが使われるのかも制御する必要がある。 この場合は、wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"を利用していることが、デフォルトでGETが使われる原因となっている。2.5.7 HTTP GET対POST: どちらを使うか?も参照。

<fault ref="tns:invalidDataFault"

バインディング・オペレーションと同様、これは新しいフォルトを宣言しているわけではない;正しくは、opCheckAvailabilityインタフェースで定義済みのフォルト(invalidDataFault)を、そのバインディングの詳細指定するために、参照している。

wsoap:code="soap:Sender"/>

この属性も、WSDL 2.0のSOAPバインディング拡張に固有である。 これは、SOAP 1.2フォルト・コードを指定している。この指定によって、フォルト・メッセージが送信される。 もしそうしたいのであれば、任意指定のwsoap:subcodes属性を用いて、サブコードのリストを指定することもできる。

2.1.6 サービスの定義 (Defining a Service)

ここまでは、バインディングでどのようにメッセージが転送されるかを指定してきた。service要素を使って、どこでサービスにアクセスできるかを指定する準備ができた。

WSDL 2.0サービスは、サービスがサポートする単一のインタフェースと、サービスにアクセスできる一連のエンドポイントのロケーションを指定する。 各々のエンドポイントは、そのエンドポイントで利用されるプロトコルと転送フォーマットを指定する、定義済みのバインディングも参照しなければならない。 一つのサービスは一つのインタフェースしか持つことができない。(この制約に関する更なる議論は、5.4同一サービスに対する複数インタフェースを参照。)

我々のGreatHサービスに対する定義がこれである。

例2-6. GreatHサービス定義

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    xmlns="http://www.w3.org/ns/wsdl"
    targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
    xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
    xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
    xmlns:wsoap= "http://www.w3.org/ns/wsdl/soap"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  . . .

  <types>
    . . .
  </types>
  
  <interface  name = "reservationInterface" >
    . . .
  </interface>

  <binding name="reservationSOAPBinding" 
          interface="tns:reservationInterface"
        . . . >
    . . .
  </binding>

  <service name="reservationService" 
       interface="tns:reservationInterface">

     <endpoint name="reservationEndpoint" 
               binding="tns:reservationSOAPBinding"
               address ="http://greath.example.com/2004/reservation"/>
        
  </service>
  
</description>
2.1.6.1 例の説明 (Explanation of Example)
<service name="reservationService"

ここでは、このサービスの名前を定義している。そのWSDL 2.0ターゲット名前空間内のサービス名を通して一意でなければならない。 name属性は必須である。WSDL 2.0記述でコンポネントを識別するためにURIsを作ることが許されている。 (WSDL 2.0 Core Language [WSDL 2.0 Core] appendix C IRI References for WSDL 2.0 constructsを参照。)

interface="tns:reservationInterface">

ここでは、これらのエンドポイントがサポートする定義済みのインタフェースの名前を指定している。

<endpoint name="reservationEndpoint"

ここでは、サービスに対するエンドポイントと、そのエンドポイントの名前を定義している。エンドポイント名は、このサービス内で一意でなければならない。

binding="tns:reservationSOAPBinding"

ここでは、このエンドポイントで使われる定義済みのバインディングを指定している。

address="http://greath.example.com/2004/reservation"/>

ここでは、binding属性で指定されてバインディングを使ってこのサービスにアクセスできる物理的なアドレスを指定している。

That's it! だいたい終わった。

2.1.7 サービスの文書化 (Documenting the Service)

我々が見てきたとおり、WSDL 2.0文書は、本質的にサービスに対する一部だけの記述だけである。 サービスとやり取りするための基本的なメカニズム -- メッセージタイプ、転送プロトコル、サービスの場所、など -- を捕らえているにせよ、一般的には、それを利用するための他のアプリケーション・レベルの要求を説明する追加のドキュメンテーションが必要になる。 例えば、そのドキュメンテーションでは、そのサービスの目的と利用、全てのメッセージの意味、それらの利用に当たっての制約、オペレーションを呼び出すべき順番を説明すべきだ。

documentation要素は、WSDL 2.0記述者が、幾つかの人可読 (human-readable)ドキュメンテーションをWSDL 2.0文書内に含められるようにする。 また、このサービスを利用するクライアント開発者にとって必要な、任意の追加外部文書を参照する場所としても便利だ。 ここの例では、我々は文書の冒頭で実例として挙げているだけであるが、documentation要素はWSDL 2.0文書内に幾つでも記述することができる(2.2.1 WSDL 2.0インフォセット参照)。

例2-7. GreatHサービスの文書化

<?xml version="1.0" encoding="utf-8" ?> 
<description 
    . . . >

  <documentation>
    この文書はGreatHサービスについて記述している。
    このサービスを利用するための、追加のアプリケーションレベルの要求 --
    WSDL 2.0で記述できる範囲以上のもの -- は、次のURIで得られる:
    http://greath.example.com/2004/reservation-documentation.html
  </documentation>
  . . .  
</description>
2.1.7.1 例の説明 (Explanation of Example)
<documentation>

この要素は任意選択であるが、含めておくのは良いことである。この要素の内容には、任意の要素を混ぜて含んでよい。

at http://greath.example.com/2004/reservation-documentation.html

含めるべき最も重要なことは、そのサービスを利用するためにクライアント開発者が必要な全ての追加文書に対するポインタである。

これでGreatHサービスの例の提示が完了した。後続の節では、我々はWSDL 2.0仕様のさまざまな面に関する更なる詳細を見ていくことになる。

2.2 WSDL 2.0インフォセット、スキーマ、コンポネントモデル (WSDL 2.0 Infoset, Schema and Component Model)

コンピュータ・サイエンスの理論では、言語はセンテンスの(上限のない)集合で構成され、各々のセンテンスは有限のリテラル・シンボルや文字から成る文字列である。 従って、言語仕様は、当該言語におけるセンテンスの集合を定義しなければならず、有用であるためには、各々センテンスの意味も示すべきである。 実際、これがWSDL 2.0仕様の目的である。

しかしながら、リテラル・シンボルや文字から成る用語においてWSDL 2.0を定義する代わりに、特定の文字符号化に依存することを避けるために、WSDL 2.0はXMLインフォセット [XML Information Set]の用度で定義されている。 特に、WSDL 2.0文書は、WSDL 2.0仕様に適合する(XMLインフォセットにおける)description要素インフォメーション・アイテムによって構成される。 言い換えると、WSDL 2.0言語のセンテンスは、WSDL 2.0仕様で言い表された追加制約に従う、description要素のインフォメーション・アイテムである。

XMLインフォセットは、一つ以上の物理的文書から作り出し得るので、WSDL 2.0文書は単一の物理的文書に対応付ける必要なくてもよい:ここでは便宜上、比喩的に「文書」という言葉を遣った。 更に、WSDL 2.0はimport and includeメカニズムを提供する。ここでは、WSDL 2.0文書は、組織化と再利用の便宜の促進のために、他のWSDL 2.0文書を参照する。 このような場合では、インクルードしたりインポートしたりする文書全体の意味は、インクルードされたりインポートされたりする文書の意味に(部分的に)依存する。

XMLインフォセットは、「要素インフォメーション・アイテム」や「属性インフォメーション・アイテム」のような用語を利用する。 不幸にも、これらの用語は頻繁に繰り返すには長すぎる。そのため、便宜上、この入門では、「要素」や「属性」と云う用語を、省略記法として、頻繁に利用している。 しかしながら、WSDL 2.0はXMLインフォセットに基づいているので、それぞれ、実際には「要素インフォメーション・アイテム」や「属性インフォメーション・アイテム」を意味していることを、理解しておくべきである。

2.2.1 WSDL 2.0インフォセット (WSDL 2.0 Infoset)

次のダイアグラムは、WSDL 2.0文書に対するXMLインフォセットの概要を与える。


WSDL 2.0 Infoset Diagram

図2-1. WSDL 2.0インフォセット・ダイアグラム


2.2.2 WSDL 2.0スキーマ (WSDL 2.0 Schema)

WSDL 2.0仕様は、[XML Schema Structures]で定義された規範的WSDL 2.0スキーマを提供する。これは、WSDL 2.0の妥当性検証 (validation)の材料として利用できる。 我々がここで「材料として」と云ったのは、WSDL 2.0仕様[WSDL 2.0 Core]はしばしばWSDL 2.0スキーマに対する更なる制約も提供するからだ。 規範的なスキーマに対して妥当であることに加えて、WSDL 2.0文書はWSDL 2.0仕様で定義された全ての制約にも従っていなければならない。

2.2.2.1 WSDL 2.0要素の順序 (WSDL 2.0 Element Ordering)

この節では、最上位のWSDL 2.0要素の順番に関して、WSDL 2.0仕様がWSDL 2.0スキーマをどのように制約するかの例を与える。

WSDL 2.0スキーマが要素の順序についての要求を示していないくても、WSDL 2.0仕様(WSDL 2.0 Part 1 [WSDL 2.0 Core] section "XML Representation of Description Component")では、description要素の子要素がどのような順序を持つべきかの制約の集合を明確に表明している。 こうして、WSDL 2.0スキーマがこの制約を含んでいないとしても、WSDL 2.0要素の順序は問題となる。

次の例は、description要素の擬似内容モデルである。

<description>
  <documentation />?
  [ <import /> | <include /> ]*
  <types />?
  [ <interface /> | <binding /> | <service /> ]*
</description>

言い換えると、description要素の子要素は、次のように並ぶべきである:

  • もしあれば、任意指定のdocumentation要素が最初に来る。

  • 次に、次のものの中から、任意の順序で、ゼロ個以上の要素が来る:

    • include

    • import

    • 拡張要素

  • 任意指定のtypes要素が続く

  • 次のものの中から、任意の順序で、ゼロ個以上の要素が来る:

    • interface

    • binding

    • service

    • 拡張要素

ここでは「拡張要素」という用語は、名前空間指定された拡張要素を指す便法として遣われている。 それらの拡張要素の名前空間名は、"http://www.w3.org/ns/wsdl"であってはならない。

2.2.3 WSDL 2.0コンポネント・モデル (WSDL 2.0 Component Model)

先ほどのWSDL 2.0インフォセット・モデルは、XMLインフォセットを用いて、WSDL 2.0文書の構造の要求を説明している。 しかしながら、WSDL 2.0言語はこのXMLインフォセットに対する、構造的な適合性にまたがって超越する、多くの意味的な制約も課している。 これらの制約を正確に記述するために、また、WSDL 2.0文書の意味を正確に定義する材料として、WSDL 2.0仕様では、XMLインフォセットを超越した追加の抽象レイヤとして、コンポネント・モデルを定義する。 制約と意味はこのコンポネント・モデルで定義され、各々のコンポネントの定義は、そのコンポネント・モデルにおける値を、XMLインフォセットの対応するアイテムから抜き出す方法のマッピングを含んでいる。 次のダイアグラムは、WSDL 2.0コンポネントとその内容の階層に関する概要を与える。


WSDL 2.0 Components Containment hierarchy

図2-2. WSDL 2.0コンポネント内容階層


一般的には、WSDL 2.0コンポネント・モデルは、先ほど説明したXMLインフォセットで要求される構造とは平行関係にある。 例えば、Description, Interface, Binding, Service and Endpointコンポネントは各々、description, interface, binding, service, and endpoint要素インフォメーションアイテムに対応する。 WSDL 2.0言語における構造の意味を含むのに、WSDL 2.0はコンポネント・モデルに深く頼っているので、Descriptionコンポネントを、description要素インフォメーション・アイテムの意味を表わすものとして考えることができて、従って、それは、全体としては、WSDL 2.0文書の意味を表わしている。

更に、これらのコンポネントの各々がプロパティを持っている。プロパティの値は、(通常は)それらの要素インフォメーション・アイテムの子供となる要素インフォメーション・アイテムと属性インフォメーションアイテムから抽出される。 例えば、Serviceコンポネントはservice要素インフォメーション・アイテムに対応し、Serviceコンポネントは{endpoint}プロパティを持つ。{endpoint}プロパティの値は、service要素インフォメーション・アイテムの子供であるendpoint要素に対応するEndpointコンポネントの集合である。(Whew!)

2.2.3.1 WSDL 2.0インポートとインクルード (WSDL 2.0 Import and Include)

WSDL 2.0コンポネント・モデルは、特に、import and include要素の意味を定義するのに役に立つ。 include要素のおかげで、名前空間のコンポネントを定義する複数のWSDL 2.0文書から、与えられたWSDL 2.0名前空間の内容をつなぎ合わせることができる。 ある与えられたWSDL 2.0文書で定義される複数のコンポネントは、その文書に定義が含まれるものと、include要素によってその文書に含まれるWSDL 2.0文書で定義されるものから構成される。 include要素の効果は、もし文書Aが文書Bを含み、文書Bが文書Cを含むのであれば、文書Aによって定義されるコンポネントは、文書A, B, Cに含まれる定義によって構成されるという、蓄積的なものである。

対照的に、import 要素は、いかなるコンポネントも定義しない。 代わりに、import要素が宣言するのは、与えられたWSDL 2.0名前空間に対するWSDL 2.0文書に定義が含まれるコンポネントが、別のWSDL 2.0名前空間に属するコンポネントを参照することである。 もし、WSDL 2.0文書が他の名前空間を参照するコンポネント定義を含むのであれば、それらの名前空間はimport要素で宣言されていなければならない。 import要素はまた、任意指定のlocation属性を持っていて、これは、処理系に対して、インポートされた名前空間の定義がどこで得られるかのヒントになる。 しかしながら、処理系は、他の手段、例えば、カタログを利用することで、定義を見つけるかもしれない。

なんらかのinclude要素が処理され、なんらかのインポートされた名前空間に属するコンポネントの場所が特定された後は、そのWSDL 2.0文書のWSDL 2.0コンポネント・モデルは、その文書のWSDL 2.0名前空間となんらかのインポートされた名前空間と属するコンポネント群の集合を含むようになる。 これらのコンポネントは、通常はQName参照によって、お互いに参照しあう。 もし何らかのコンポネント参照が解決できないのであれば、その参照されているコンポネントが属している名前空間が、同じものであれ、別のものであれ、そのWSDL 2.0文書は不正である。

WSDL 2.0のインポートとインクルードの使い方については、3.1 WSDLのインポートで、より多くをカバーする。

2.3 メッセージ型についての詳細 (More on Message Types)

メッセージ型は、さまざまなスキーマ言語で定義され得る。 この入門では、WSDL 2.0でネイティブ・サポートされているために、XML Schema [XML Schema Structures]の利用だけに集中している。 他の言語で定義されたメッセージ型は、拡張のWSDL 2.0 descriptionの中で導入されるかもしれない。更なる詳細は、W3Cノート[Alternative Schema Languages Support]を参照。

次のものは、wsdl:types要素のXMLシンタックスである:

<description>
  <types>
    <documentation />*
    [ <xs:import namespace="xs:anyURI" schemaLocation="xs:anyURI"? /> |
      <xs:schema targetNamespace="xs:anyURI" /> |
      other extension elements ]*
  </types>
</description>

WSDL 2.0文書で、XML Schemaメッセージ定義を可視化、言い換えると、QName(WSDL 2.0 Part 1 [WSDL 2.0 Core] "QName Resolution"参照)で参照できるようにするためには、二つの方法がある:インライン化とインポートである。 インライン化は、types配下のxs:schema要素内に、直接スキーマ定義を配置することである。 インポートは、スキーマを別の文書内に定義し、types直下のxs:importを使って、WSDL定義に持ち込むことである。

後続の節では、別のメカニズムの例を提供する。

2.3.1 XML Schemaのインライン化 (Inlining XML Schema)

我々は、すでに2.1.3 メッセージ型の定義の中で、既にインライン化スキーマを利用した例を見てきた。 WSDL 2.0文書の中で、XMLスキーマが直にインライン化される場合、これを実現するためには、既存の最上位レベルのXMLスキーマによって定義されたxs:schema要素を利用する。これは、まるでtypes要素内にスキーマファイルがコピー&ペーストされたようなものである。 インライン化されたスキーマで定義されたスキーマ・コンポネントは、包含WSDL 2.0 descriptionでQNameで参照するために利用できるようになる。 例えば、例2-1では、インタフェース・オペレーション"opCheckAvailability"の入力メッセージは、インライン化されたスキーマの"ghns:checkAvailability"要素で定義される。

2.3.2 XML Schemaのインポート (Importing XML Schema)

XML Schemaコンポネントは、分離されたスキーマファイルで定義可能であり、types要素直下のxs:importを用いて、WSDL2.0 descriptionで利用可能できる。

分離されたスキーマファイルでスキーマを定義したくなるときには、多くの場合がる。 一つの理由は、スキーマ定義の再利用性だ。 インライン化されたスキーマ定義は、包含WSDL 2.0 descriptionでしか利用できない。 WSDL 2.0は、他のWSDLファイルをインポートするためのwsdl:importメカニズムを提供する。 インポートされたWSDL文書内でインライン化されているスキーマ定義は、他のWSDL 2.0コンポネント(インタフェース、バインディングなど)が利用可能になったとしても、自動的にはインポートするWSDL 2.0文書で利用可能にはならない。 従って、もし複数のWSDL 2.0 descriptionでスキーマ定義を共有したいのであれば、これらのスキーマ定義は別のXML Schema文書に配置しておき、types直下のxs:importを使って、各々のWSDL 2.0 descriptionへインポートすべきである。

例を見てみよう。 例2-3のメッセージ型が、ターゲット名前空間"http://greath.example.com/2004/schemas/resSvc"を持つ別のスキーマファイル"http://greath.example.com/2004/schemas/resSvc.xsd"で定義されているとすると、そのスキーマ定義は、xs:importを使ってWSDL 2.0 descriptionの中に持ち込むことができる。 インポートされた名前空間"http://greath.example.com/2004/schemas/resSvc"内のコンポネントだけが、WSDL 2.0文書内で参照するために利用可能になることに注意して欲しい。

例2-8. xs:importされたメッセージ定義。包含WSDL 2.0 Descriptionから可視的になる

<?xml version="1.0" encoding="utf-8" ?> 
<description xmlns="http://www.w3.org/ns/wsdl"
targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
. . . >
. . .

<types>
        <xs:import namespace="http://greath.example.com/2004/schemas/resSvc" 
                schemaLocation= "http://greath.example.com/2004/schemas/resSvc.xsd"/>  
</types>

. . .
</description>

wsdl:typesの直下で使われているxs:importが、インライン化されたスキーマ内で使われいてるxs:importとは異なる可視性を与えられていることに注意を向けることが重要である。 インライン化されたスキーマは、異なる名前空間内にある外部のスキーマ定義を持ち込むために、ネイティブXMLスキーマxs:importを使ってもよい; しかしながら、これがWS-I Basic ProfileのWSDL 1.1に対して勧告されたスキーマのインーポーティング・メカニズムであっても、XML Schema仕様によれば、そのような閉じたメッセージ定義は、インポートしているスキーマ(この例では、インライン化されたスキーマ)に対してしか可視的ではない。 それらは、包含WSDL 2.0 descriptionに対して可視的ではない。

もし我々が例2-8を、インライン化されたスキーマ内のXML Schemaネイティブxs:import要素を使うように変更すると、http://greath.example.com/2004/schemas/resSvcで定義されるスキーマ・コンポネントは、我々の例のWSDL 2.0定義のどこでも利用できなくなる。

例2-9. インライン化されたスキーマ内のxs:importされたメッセージ定義は、包含WSDL 2.0 Descriptionに対して可視的ではない

<?xml version="1.0" encoding="utf-8" ?> 
<description xmlns="http://www.w3.org/ns/wsdl"
targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
. . . >
. . .

<types>
        <xs:schema targetNamespace="http://greath.example.com/2004/schemas/resSvcWrapper">
                <xs:import namespace="http://greath.example.com/2004/schemas/resSvc" 
                schemaLocation= "http://greath.example.com/2004/schemas/resSvc.xsd"/>  
        </xs:schema>
</types>

. . .
</description>

もちろん、インライン化されたXML Schemaは、インクルードされるスキーマが名前空間を持たない場合やインクルードするスキーマと同じ名前空間を持つ場合は、別のファイルに定義されたスキーマを参照するために、XML Schemaのネイティブxs:include要素を使ってもよい。 この場合は、XML Schemaによれば、インクルードされたスキーマ・コンポネントは、あたかもインクルードするスキーマにコピー&ペーストされたかのように、インクルードするスキーマの一部となる。 従って、インクルードされたスキーマコンポネントは、包含するWSDL 2.0 descriptionに対して、QNameによる参照のために利用可能でもある。

次の例は、例2-3と同様の効果を持つ:

例2-10. インライン化されたスキーマ内のxs:includeされたメッセージ定義は、包含WSDL 2.0 Descriptionに対して可視的になる

<?xml version="1.0" encoding="utf-8" ?> 
<description xmlns="http://www.w3.org/ns/wsdl"
targetNamespace= "http://greath.example.com/2004/wsdl/resSvc" 
xmlns:tns= "http://greath.example.com/2004/wsdl/resSvc"
xmlns:ghns = "http://greath.example.com/2004/schemas/resSvc"
. . . >
. . .

<types>
        <xs:schema targetNamespace="http://greath.example.com/2004/schemas/resSvc">
                <xs:include schemaLocation= "http://greath.example.com/2004/schemas/resSvc.xsd"/>  
        </xs:schema>
</types>

. . .
</description>

2.3.3 インポートとインクルード・メカニズムのサマリー (Summary of Import and Include Mechanisms)

ここまでで、我々はWSDLインポートとインクルード、およびスキーマ・インポートとインクルードの両方を簡単にカバーした。 次の表は、WSDL 2.0とML Schemaのincludeおよびimportメカニズム間に見られる類似と差異をまとめたものだ。 我々は、3.1 WSDLのインポート3.2 Schemaのインポートで、インポーティング・メカニズムについて、もっと多くのことを話題にする。

Table 2-1. インポートおよびインクルード・メカニズムのまとめ
メカニズム 対象 意味 スキーマコンポネントの可視性
wsdl:import WSDL 2.0名前空間 WSDL 2.0コンポネントが、異なったtargetNamespaceからWSDL 2.0コンポネントを参照することを宣言する。 インポートされたDescriptionコンポネント内のXML Schemaコンポネントは、包含descriptionに対して可視的ではない。
wsdl:include WSDL 2.0文書 同じtargetNamespaceを持つ別のWSDL 2.0文書から、Interface, Binding, Serviceコンポネントをマージする。 インクルードされたDescriptionコンポネントの{要素宣言}と{型定義}プロパティ内のXML Schemaコンポネントは、包含descriptionに対して可視的になる。
wsdl:types/ xs:import XML Schema名前空間 XML Schemaコンポネントが、異なったtargetNamespaceからXML Schemaコンポネントを参照することを宣言する。 インポートされた名前空間内のXML Schemaコンポネントは、包含descriptionに対して可視的になる。
wsdl:types/ xs:schema/ xs:import XML Schema名前空間 XML Schemaコンポネントが、異なったtargetNamespaceからXML Schemaコンポネントを参照することを宣言する。 インポートされた名前空間内のXML Schemaコンポネントは、包含descriptionに対して可視的ではない。
wsdl:types/ xs:schema/ xs:include XML Schema文書 同じtargetNamespaceか、targetNamespaceを持たない、別のXML Schema文書からXML Schema文書をマージする。 インクルードされた文書内のXML Schemaコンポネントは、包含descriptionに対して可視的になる。

2.4 インタフェースの詳細 (More on Interfaces)

我々は、先ほど、WSDL 2.0インタフェースは、基本的にはオペレーションの集合であると述べた。 しかしながら、我々がまだカバーしていない追加能力も存在する。 手始めに、interface要素のシンタックスを見てみよう。

2.4.1 インタフェースのシンタックス (Interface Syntax)

次の挙げたものが、interface要素のXMLシンタックスのサマリーである。単純化のために、任意指定の<documentation>要素については省略してある:

<description targetNamespace="xs:anyURI" >

  . . .
  <interface name="xs:NCName" 
          extends="list of xs:QName"? 
          styleDefault="list of xs:anyURI"? >

    <fault name="xs:NCName" 
            element="xs:QName"? >
    </fault>*

    <operation name="xs:NCName" 
            pattern="xs:anyURI" 
            style="list of xs:anyURI"? 
            wsdlx:safe="xs:boolean"? >

      <input messageLabel="xs:NCName"? 
            element="union of xs:QName, xs:Token"? >
      </input>*

      <output messageLabel="xs:NCName"? 
            element="union of xs:QName, xs:Token"? >
      </output>*

      <infault ref="xs:QName" messageLabel="xs:NCName"? > </infault>*

      <outfault ref="xs:QName" messageLabel="xs:NCName"? > </outfault>*

    </operation>*

  </interface>*
  . . .

</description>
  

interface要素には二つの任意指定の属性がある:styleDefaultextendsだ。 styleDefault属性は、このインタフェース配下の全てのオペレーションに対するstyle属性のデフォルト値を定義するために使える(WSDL 2.0 Part 1 "styleDefault属性インフォメーション・アイテム"参照)。 extends属性は、継承のためのもので、次に説明する。

2.4.2 インタフェース継承 (Interface Inheritance)

任意指定のextends属性によって、インタフェースを、一つ以上のインタフェースから拡張あるいは継承できるようになる。 このような場合では、インタフェースは、それが直接定義するインタフェースと共に、それが拡張する複数のインタフェースを含んでいる。 インタフェースの拡張に関して二つの事柄が、いくらかの注意を払うに値する。

第一に、継承ループ(または無限再起)は禁止されている: あるインタフェースが継承するインタフェースは、それら自身ではそのインタフェースを、直接的と間接的とを問わず、継承してはならない。

第二に、二つの異なるインタフェースが、同じターゲット名前空間とオペレーション名を持つとき、何が起こるかを説明しなければならない。 これには二つの場合がある:それらのオペレーションのコンポネント・モデルが、同じであるか、異なっているかだ。 もしコンポネント・モデルが同じであれば(WSDL 2.0 Part 1 [WSDL 2.0 Core] " 等価なコンポネント"で定義されているコンポネント競合アルゴリズムを参照)、それらは同じオペレーションであるとみなさなけれる、例えば、それらは一つのオペレーションに縮約され、一度以上含まれているという事実は、エラーとは考えられない。 (オペレーションにとっては、コンポネント等価性は、基本的には二つのオペレーションが、同じ属性と子孫の集合を持つことを意味している。) 第二の場合、二つのオペレーションが同一WSDL 2.0ターゲット名前空間内で同じ名前を持つが、それらが等価ではない場合は、エラーである。 上記の理由で、同一の名前空間内の全てのオペレションは一意に名付けられていることを保証することは、グッド・プラクティスであると考えられる。

最後に、フォルトはinterface要素の子供として定義され得るので(次の節で記述されるように)、同一の名前競合規則がそれらの構造に適用される。

GreatHホテルが、全ての応答メッセージに対する標準的なメッセージ・ログ・オペレーションをメンテナンスしたいとしよう。 そこでは、このオペレーションが全ての予約システムをまたがって再利用可能であることを求めている。各々のサービスが、潜在的にロギング・サービスを利用するために、タイムスタンプとメッセージのオリジネータと一緒に受信する各メッセージの内容を送信する。 この要求を満たす一つの方法は、他のインタフェースによって継承されるインタフェースの中で、ログ・オペレーションを定義することである。 messageLog要素が、既にghns名前空間内に、要求されている内容で定義されているとすると、継承ユースケースは次の例のように説明される。 継承の結果、reservationInterfaceは、このとき、二つのオペレーションを含む:opCheckAvailabilityopLogMessageだ。

例2-11. インタフェース継承

                                        
<description ...>
        ...
        <interface  name = "messageLogInterface" >
                                
                <operation name="opLogMessage" 
                                pattern="http://www.w3.org/ns/wsdl/out-only">
                        <output messageLabel="out" 
                                element="ghns:messageLog" />
                </operation>

        </interface>

        <interface  name="reservationInterface" extends="tns:messageLogInterface" >
   
                <operation name="opCheckAvailability" 
                                pattern="http://www.w3.org/ns/wsdl/in-out"
                                style="http://www.w3.org/ns/wsdl/style/iri"
                                wsdlx:safe = "true">
                        <input messageLabel="In" 
                                element="ghns:checkAvailability" />
                        <output messageLabel="Out" 
                                element="ghns:checkAvailabilityResponse" />
                        <outfault ref="tns:invalidDataFault" messageLabel="Out"/>

                </operation>
        </interface>
        ...
</description>

interfaceの子要素について見ていこう、faultから始める。

2.4.3 インタフェース・フォルト (Interface Faults)

fault要素は、インタフェースのオペレーションの実行中に発生するかもしれないフォルトを宣言するために使われる。 それらは、複数のオペレーションにまたがって再利用できるようにするために、interface直下で宣言され、それらが適用されるオペレーションから参照される。

フォルトはメッセージととてもよく似ており、特殊なメッセージとしてみなせる。 フォルトとメッセージは両方とも、通常は要素宣言によって記述されるパイロードを運ぶかもしれない。 しかしながら、WSDL 2.0はフォルトとメッセージを若干異なる方法で扱う。 オペレーションのメッセージはその要素宣言を直接参照するが、オペレーションのフォルトはその要素宣言を、インタフェースで定義されたフォルト要素を通して、間接的に参照する。

フォルトをインタフェースレベルで定義する理由は、それらを複数のオペレーションにまたがって再利用できるようにするためだ。 この設計は特にバインディングが定義されるときに有用である。SOAPのようなバインディング拡張では、フォルトと関連する追加情報が存在するからだ。 SOAPの場合、フォルトはペイロードに加えて、コードとサブコードを持つ。 フォルトをインタフェース・レベルで定義することで、共通コードとサブコードを、それらと関連らセルことができる。よって、それらのフォルトを利用する全てのオペレーションにまたがる一貫性を保証することになる。

fault要素は、親のinterface要素内で一意でなければならない、必須のname属性を持つ。この属性は、オペレーション宣言から参照されることを許す。 任意のelement属性は、フォルト・メッセージの内容、つまりペイロードのスキーマを示すために使える。 その値は、typesセクションで定義したグローバル要素のQNameであるべきである。 他の型システムがフォルト・メッセージのスキーマを定義するために使われるときは、そのスキーマをフォルトと関連されられるように、WSDL 2.0属性拡張メカニズムによって、追加属性の定義が必要になるかもしれないことに注意して欲しい。

2.4.4 インタフェース・オペレーション (Interface Operations)

先ほど示したように、operation要素は、包含インタフェースによってサポートされるオペレーションを示すために使われる。 それは、Webサービスとの単純なやりとりを抽象的に記述するために、メッセージ・スキーマとメッセージ交換パターン(MEP)を関連付ける。

2.4.4.1 オペレーション属性 (Operation Attributes)

operationは、二つの必須属性と、一つの任意属性を持つ:

  • 必須name属性は、既に見てきたとおり、インタフェース内で一意でなければならない。

  • 必須pattern属性の値は、そのオペレションに対して望んでいるMEPを識別する絶対URIでなければならない。MEPsについては、2.4.4.3 メッセージ交換パターン(Message Exchange Patterns (MEPs))の理解で更に説明されている。

  • 任意style属性の値は、絶対URIsのリストである。各々のURIは、このoperation定義で従うある規則集合を識別する。もし、特定のスタイルが指定されているが、関連する規則が守られないのであれば、エラーである。[WSDL 2.0 Adjuncts]では、次のものを含むスタイルの集合が定義されている

    • RPCスタイル。RPCスタイルは、styleの値にhttp://www.w3.org/ns/wsdl/rpcを割り当てるときに選択される。 リモートプロシジャーコール型のやりとりに制約とするときに使われる。

    • IRIスタイル。IRIスタイルは、styleの値にhttp://www.w3.org/ns/wsdl/style/iriを割り当てるときに選択される。 HTTP URLエンコードのような形にシリアライズされるかもしれないメッセージ定義の制約に使われる。

    • Multipartスタイル。Multipartスタイルは、styleの値にhttp://www.w3.org/ns/wsdl/style/multipartを割り当てるときに選択される。 HTTPバインディングでは、XFormsクライアントに対して、メッセージはMultipartスタイルに従って定義し、"Multipart/form-data"としてシリアライズされなければならない。

    これらのWSDL 2.0定義済みスタイルの更なる詳細を見つけることができる。 4.3 RPC Style節では、RPC styleの利用例を提供する。 [WSDL 2.0 Adjuncts]では、IRIスタイルとMultipartスタイルの例を提供する。

[WSDL 2.0 Adjuncts]がオペレーションの安全性を示す定義済み拡張を提供することに注意して欲しい。 ブーリアン値を持つwsdlx:safeグローバル属性は、クライアントからの呼び出しに対して、そのオペレーションが"safe"である(Section 3.5 of the Web Architecture [Web Architecture]で定義されている)と注釈されているかどうかを示すためにオペレーションに指定できる。 本質的には、安全なオペレーションとは、クライアントに対していかなる新しい責務も負わせない任意のオペレーションのことである。 例えば、クライアントが製品の価格を確認できるオペレーションは、通常はクライアントにそれらの製品を購入させる責務を負わせないであろうから、安全であるだろう。一方、製品購入のオペレーションは、クライアントに注文された製品に対する支払いの責務を負わせるだろう。

Web Architecture [Web Architecture]のセクション3.5で定義されている安全なやり取りの条件を満たすのであれば、オペレーションは安全であるとマークされるべき(このマークにはwsdlx:safeを用い、その値には"true"をセットする)である。 このことによって、基盤が有効な最適化、例えば、プリ・フェッチ、リフェッチ、キャッシングなどを行えるからである。

この属性のデフォルト値は偽(false)である。 もし偽または何も設定されていないのであれば、そのオペレーションの安全性については一切注釈されない;つまり、そのオペレーションは、安全であるかもしれないし、そうでないかもしれない。

2.4.4.2 オペレーション・メッセージ参照 (Operation Message References)

operationは、子要素として、input, output,infault, and/or outfault要素を持つ。これらの子要素で、そのオペレーションによって使われる正常メッセージ型とフォルト・メッセージ型を指定する。 pattern属性によって指定されるMEPは、これらの要素のどれがインクルードされるべきかを決定する。 各々のMEPは、そのパターンに含まれるメッセージタイプのための、プレイスホルダーを持つからである。 The MEP specified by the pattern attribute determines which of these elements should be included, since each MEP has placeholders for the message types involved in its pattern.

オペレーションについては、既に2.1.4 Defining an Interfaceで議論されているので、このセクションでは、先ほど説明されていない追加の機能に関してコメントするだけにする。

2.4.4.2.1 messageLabel属性 (The messageLabel Attribute)

input要素とoutput要素のmessageLabel属性は任意である。 MEPがWSDL 2.0 Part 2 [WSDL 2.0 Adjuncts]で定義されている8つのMEPsの一つであり、与えられた指示を持つたった一つのメッセージであれば、messageLabelを顕に設定することは必要ではない。

2.4.4.2.2 element属性 (The element Attribute)

input要素とoutput要素のelement属性は、内容モデルがXML Schemaで定義されるとき、メッセージ内容スキーマ(別名ペイロード・スキーマ)を指定するために使われる。 既に見てきたとおり、それはtypesセクションで定義された要素スキーマのQNameで指定できる。 しかしながら、別の方法として、次のトークンのいずれかを指定することもできる:

#any

メッセージ内容は任意の単一要素である。

#none

メッセージ内容は存在しない。つまり、メッセージのペイロードは空である。

#other

メッセージ内容は非XML型システムで記述されている。拡張属性が型を指定する。

element属性も任意である。 もしそれが指定されていないならば、メッセージ内容は非XML型システムで記述される。

element属性に含まれる情報では、サービス実装が受け取るメッセージを一意に識別して適切なオペレーションに割り振るために十分ではない状況が存在することに注意してほしい。 そのような状況では、受け取るメッセージを識別するための追加の手段が必要となるだろう。 より詳細については5.1 Enabling Easy Message Dispatchを参照。

2.4.4.2.3 複数のinfault, outfault要素 (Multiple infault or outfault Elements)

operation要素内でinfault要素と/やoutfault要素が複数登場したときは、それらは代替フォルト・メッセージを定義する。

2.4.4.3 メッセージ交換パターン(MEPs)の理解 (Understanding Message Exchange Patterns (MEPs))

WSDL 2.0メッセージ交換パターン(MEPs)は、オペレーション内の抽象メッセージのシーケンスとカーディナリティを定義するために使われる。 設計上は、WSDL 2.0 MEPsは抽象である。 まず第一に、特定のメッセージ型を抽象化する。 MEPsはメッセージのプレイスホルダーを指定し、プレイスホルダーは、オペレーションが定義されるときに特定のメッセージ型と結び付けられる。ここでは、そのオペレーションのためにどのMEPが使われるのかの指定が含まれる。 第二に、他に明示的に表明されていない限り、MEPsはメッセージ間のタイミングや、そのパターンが同期か非同期か、メッセージ送信が単一チャネルか複数のチャネルかといったような、バインディング固有の情報も抽象化する。

WSDL 2.0 MEPsがサービスと他のノードの間で交換され得るメッセージのセットを余すところなく記述しているわけではないことを指摘しておくことは重要だ。 幾つかの事前の合意によって、他のノードと/やサービスがMEPによって記述されていない他のメッセージを(お互いに、または他のノードへ)送っても良い。 例えば、MEPがサービスから他のノードへ送られる単一メッセージを定義したとしても、そのMEPによって定義されたサービスがそのメッセージを他のノードへマルチキャストしても良い。 再利用を最大化するために、WSDL 2.0メッセージ交換パターンは、他の組織やWebサービスとの間の、最小の契約しか指定しないし、そのサービスに従事するWebサービスとクライアントの両方に関係する情報だけを含む。

全8つのMEPsは[WSDL 2.0 Adjuncts]で定義されている。 これらのMEPsは、ほとんどの一般的なユースケースをカバーするはずだが、オペレーションで使われ得るMEPsの全ての一覧であることを意味するわけではない。 利害関係者による特定の適用ニーズのために、他のMEPsも定義できる。 (2.4.4.3 Understanding Message Exchange Patterns (MEPs)参照。)

WSDL 2.0で定義された8つのMEPsにとって、それらのうちの幾つかは、他のもののフォルト・メッセージの生成方法に基づくバリエーションである。 例えば、In-Onlyパターン("http://www.w3.org/ns/wsdl/in-only")は、他の何らかのノードからの厳密に単一のメッセージ受信で構成されている。フォルト・メッセージはまったく生成されない。 In-Onlyパターンのヴァリエーションとして、堅牢In-Onlyパターン("http://www.w3.org/ns/wsdl/robust-in-only")もまた、サービスから厳密に単一のメッセージ受信によって構成されるが、この場合は、メッセージによってフォルトが起動され得て、メッセージ送信元に送達されなければならない。 このノードへのパスが存在しなければ、そのフォルトは破棄される。8つのWSDL 2.0 MEPsによって使われる一般的なフォルト生成モデルについての詳細は、[WSDL 2.0 Adjuncts]参照。

MEPの最初のメッセージの初期化方法に依存して、8つのMEPsは二つのグループに分けられる: インバウンドMEPsは、サービスはその交換の最初のメッセージの受信から始める。アウトバウンドMEPsは、その交換の最初のメッセージの送信からはじめる。(このグルーピングは、WSDL 2.0仕様では提供されておらず、ここで提示したのは、この入門で簡単に参照するためだけである。)

アウトバウンドMEPsに関する頻出質問は、サービスがどのようにしうてメッセージの送信先を知るかである。 アウトバウンドMEPsを用いるサービスは、定型的には、マッピングとルーティング・ファシリティに依存した大規模統合システムの一部である。 そのようなシステムでは、アウトバウンドMEPsは、サービスの機能を抽象的に指定し、潜在的顧客の要求を取り込むために有意義だ。エンドポイント・アドレス情報は、仮想の統合基盤によってデプロイや実行時に提供され得るからである。 例え