Webszolgáltatás-leíró nyelv

A Wikipédiából, a szabad enciklopédiából
Webszolgáltatás-leíró nyelv
Web Services Description Language
Fájlkiterjesztés .wsdl
MIME-típus application/wsdl+xml
Fejlesztő World Wide Web Consortium
Konténerformátuma ennek XML
Standard 2.0-s ajánlás

A Webszolgáltatás leíró nyelv (angolul Web Services Description Language, röviden WSDL) webszolgáltatások leírására szolgáló XML formátum. Az 1.1-es verziót a World Wide Web Consortium (W3C) nem hagyta jóvá, a 2.0-s verzió viszont már egy ajánlás (hivatalos szabvány) a W3C jóváhagyásával.

A WSDL a webszolgáltatás nyilvános felületét írja le, beleértve a használható üzenetek formátumát. A támogatott műveletek és üzenetek először absztrakt módon vannak definiálva, majd ezek a definíciók vannak hozzákötve a tényleges hálózati protokollhoz és üzenetformátumhoz.

A WSDL-t általában SOAP-pal XSD-vel együtt használják, hogy webszolgáltatást nyújtsanak az interneten. Egy webszolgáltatáshoz kapcsolódó kliens-program (általában a szolgáltatás tényleges használatától függetlenül) le tudja kérni WSDL-t, hogy feltérképezze a rendelkezésre álló funkciókat a szerveren.

Egy WSDL-fájl további WSDL-fájlokat importálhat. Az üzenetekben használhatók a beépített XML-adattípusok, illetve egyedi, összetett adattípusok is definiálhatók XML Schema nyelven. Külső XSD-fájlok is importálhatók.

A WSDL-fájl szerkezete[szerkesztés]

WSDL 1.1 és 2.0
Különbségek a WSDL 1.1 illetve 2.0 struktúrájában

A WSDL 1.1 illetve 2.0 által használt XML-struktúra hasonló, de több lényeges helyen is eltér.

A különbségeket a bal oldali ábra és a lenti táblázat foglalja össze.

A WSDL 1.1 és 2.0 különbségei
WSDL 1.1 terminológia WSDL 2.0 terminológia Értelmezés
service service Összefoglalja az elérhető szolgáltatásokat. Felsorolja a port/endpoint elemeket. Sokszor egy documentation elemet is tartalmaz, mely folyószöveges formában nyújt további információkat.
port endpoint Megadja, hogy a szolgáltatás konkrétan milyen webcímen érhető el. Környezetfüggő beállítás.
binding binding Egy portType/interface átviteli beállításait adja meg. SOAP esetén megadható a SOAP binding style (RPC/Document) és a transport (SOAP Protocol). További beállítások minden művelethez külön-külön megadhatók (HTTP esetén például a HTTP metódus).
portType interface Definiál egy webes szolgáltatást. Felsorolja, hogy a szolgáltatás milyen műveleteket (operation) használ. A műveletek definíciója a szolgáltatás definícióján belül felsorolva található.
operation operation Definiál egy műveletet, és hivatkozással megadja, hogy melyik üzenettípust (message) használja. Nagyjából megfeleltethető a hagyományos programnyelvekben használt függvényhívás műveletnek.
message n/a Megad egy formátumot, melyet a műveletek használhatnak az adatok továbbítására. Több művelet is használhatja ugyanazt a formátumot. A message-hez mindig tartozik valamilyen (általában összetett egyedi) adattípus, ezért a WSDL 2.0-ban eltörölték a használatát, a műveleteknél közvetlenül az adattípust kell megadni.
types types Az egyedi adattípusokat definiálja XML Schema (XSD) nyelven. Külső XSD fájlok is importálhatók.

Példakód[szerkesztés]

<?xml version="1.0" encoding="UTF-8"?>
<description 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:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name" type="xs:string" use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="method" type="xs:string" use="required"/>
               <xs:attribute name="uri" type="xs:anyURI" use="required"/>
            </xs:complexType>
         </xs:element>
         
         <xs:element name="response">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="header" maxOccurs="unbounded">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:string">
                              <xs:attribute name="name"  use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
                  <xs:element name="body" type="xs:anyType" minOccurs="0"/>
               </xs:sequence>
               <xs:attribute name="status-code" type="xs:anySimpleType" use="required"/>
               <xs:attribute name="response-phrase" use="required"/>
            </xs:complexType>
         </xs:element>
      </xs:schema>
   </types>

<!-- Abstract interfaces -->
   <interface name="RESTfulInterface">
      <fault name="ClientError" element="tns:response"/>
      <fault name="ServerError" element="tns:response"/>
      <fault name="Redirection" 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>
      <operation name="Post" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
      <operation name="Put" pattern="http://www.w3.org/ns/wsdl/in-out">
         <input messageLabel="In" element="tns:request"/>
         <output messageLabel="Out" element="tns:response"/>
      </operation>
      <operation name="Delete" 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="RESTfulInterfaceHttpBinding" interface="tns:RESTfulInterface" 
            type="http://www.w3.org/ns/wsdl/http">
      <operation ref="tns:Get" whttp:method="GET"/>
      <operation ref="tns:Post" whttp:method="POST" 
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Put" whttp:method="PUT" 
                 whttp:inputSerialization="application/x-www-form-urlencoded"/>
      <operation ref="tns:Delete" whttp:method="DELETE"/>
   </binding>
   
<!-- Concrete Binding with SOAP-->
   <binding name="RESTfulInterfaceSoapBinding" interface="tns:RESTfulInterface" 
            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" />
      <operation ref="tns:Post" />
      <operation ref="tns:Put" />
      <operation ref="tns:Delete" />
   </binding>
   
<!-- Web Service offering endpoints for both bindings-->
   <service name="RESTfulService" interface="tns:RESTfulInterface">
      <endpoint name="RESTfulServiceHttpEndpoint" 
                binding="tns:RESTfulInterfaceHttpBinding" 
                address="http://www.example.com/rest/"/>
      <endpoint name="RESTfulServiceSoapEndpoint" 
                binding="tns:RESTfulInterfaceSoapBinding" 
                address="http://www.example.com/soap/"/>
   </service>
</description>

További információk[szerkesztés]