Web Services Description Language

Web Services Description Language (WSDL ウィズダル) とは、Webサービス記述言語の意で、SOAPによるXML Webサービスのインタフェースを記述するインタフェース記述言語。通常その表現にはXMLを使う。WSDLは、サービスの呼出方法、それが期待するパラメータ群、それが返すデータ型について、機械可読な形式の記述を提供する。従って、その目的はプログラミング言語におけるメソッド・シグネチャの役割に似ている。
WSDLの現在のバージョンはWSDL 2.0である。省略語WSDLにおけるDの意味はバージョン1.1当時の「Definition」から変更されている。
関連文書に多数の混乱があるため、まず、必ずWS-IのBasic Profileの「5. Service Description」を熟読すべきである。

説明

WSDLはサービスをネットワーク上の「endpoint」または「port」の集合として記述する。この目的を果たす文書の仕様としてWSDL仕様は一つのXMLフォーマットを提供する。「port」や「message」の抽象的な定義は、それらの具体的な仕様や実体とは分離されている。それにより、これらの定義の再利用も可能になっている。「port」とは、ネットワークアドレスを再利用可能な「binding」で対応づけることにより定義され、「port」の集団として「service」が定義される。「message」とは交換されるデータを抽象的に表現した言い方であり、「port type」とはサポートされている「operation」の抽象的な集団である。特定の「port type」のための具象的なプロトコルとデータ形式の仕様が再利用可能な「binding」を構成し、そこで「operation」と「message」が具象的なネットワークプロトコルとメッセージ形式に対応づけられる。このようにして、WSDLはWebサービスへの公開インタフェースを記述する。
WSDLはSOAPとXMLスキーマと組み合わせて、インターネット上にWebサービスを提供するために使われることが多い。Webサービスに接続するクライアント側のプログラムはWSDLファイルを読んで、そのサーバでどのような操作が可能なのかを知ることができる。利用される何らかの特殊なデータ型もWSDLファイル内にXMLスキーマの形で埋め込まれている。するとクライアントはSOAPを使ってWSDLファイル内に挙げられている操作の内の一つを実際に呼び出すことが出来る（例えばHTTP上でXMLを交換する)。
WSDL仕様の現在のバージョンは2.0である。; バージョン 1.1は W3Cの推奨を受けていなかったが、バージョン2.0 はW3C勧告である。 WSDL 1.2 が WSDL 2.0 に名称変更された。その理由はWSDL 1.1とは本質的に異なるからである。
（バージョン1.1当時のGETとPOSTだけでなく）全てのHTTPリクエストメソッド を受け付けることで、WSDL 2.0仕様はRESTfulなウェブサービスのよりよくサポートでき、実装するのもより簡単になった。

WSDLファイル サンプル

<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.w3.org/ns/wsdl" 
             xmlns:tns="http://www.tmsws.com/wsdl20sample" 
             xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/"
             xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/"
             targetNamespace="http://www.tmsws.com/wsdl20sample"><!-- Abstract type -->
   <types>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns="http://www.tmsws.com/wsdl20sample"
                targetNamespace="http://www.example.com/wsdl20sample">
                 
         <xs:element name="request"> ... </xs:element>
         <xs:element name="response"> ... </xs:element>
      </xs:schema>
   </types><!-- Abstract interfaces -->
   <interface name="Interface1">
      <fault name="Error1" element="tns:response"/>
      <operation name="Get" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
   </interface><!-- Concrete Binding Over HTTP -->
   <binding name="HttpBinding" interface="tns:Interface1" 
            type="http://www.w3.org/ns/wsdl/http">
      <operation ref="tns:Get" whttp:method="GET"/>
   </binding>
   
<!-- Concrete Binding with SOAP-->
   <binding name="SoapBinding" interface="tns:Interface1" 
            type="http://www.w3.org/ns/wsdl/soap" 
            wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
            wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
      <operation ref="tns:Get" />
   </binding><!-- Web Service offering endpoints for both bindings-->
   <service name="Service1" interface="tns:Interface1">
      <endpoint name="HttpEndpoint" 
                binding="tns:HttpBinding" 
                address="http://www.example.com/rest/"/>
      <endpoint name="SoapEndpoint" 
                binding="tns:SoapBinding" 
                address="http://www.example.com/soap/"/>
   </service></definitions>