SOAP
WSDL
UDDI
Børre Stenseth
Moduler > Webservices

Webservices

SOAP | WSDL | Referanser

Webservice er et generelt navn som har fått en spesiell betydning. Det brukes om ressurser på nettet som kan nås via et definert grensesnitt. W3C har definert begrepet. En Webservice er beskrevet med et XML-format: WDSL (Web Service Description Language) [1] . Dette beskriver de tjenestene Webservicen leverer og hvordan vi skal nå dem. Vi kommuniserer med en Webservice med et annet XML-språk en protokoll: SOAP (Simple Object Access Protocol) [2] .

Det finnes mange tilbydere av Webservices, f.eks. finnes det noe å eksperimentere med på WebserviceX.net [3] . Det er laget et eget format for å administrere Webservices, UDDI (Universal Description, Discovery, and Integration) [4]

SOAP

Anta at vi skal kommunisere med en enkel Webservice, HelloWorld, som returnerer en enkel melding.

Vi sender over HTTP:

POST /borres/dn/service1/Service.asmx HTTP/1.1
Host: donau.hiof.no
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.donau.hiof.no/borres/dn/demosite1/s1/HelloWorld"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <HelloWorld xmlns="http://www.donau.hiof.no/borres/dn/demosite1/s1/" />
  </soap:Body>
</soap:Envelope>

og vi mottar:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <HelloWorldResponse xmlns="http://www.donau.hiof.no/borres/dn/demosite1/s1/">
      <HelloWorldResult>string</HelloWorldResult>
    </HelloWorldResponse>
  </soap:Body>
</soap:Envelope>

length og string står som plassholdere og må erstattes med de aktuelle verdiene.

Vi går ikke inn i detaljene i SOAP-formatet her. Vi kan imidlertid merke oss at det er en overkommelig programmeringsjobb å skrive både den koden som sender forespørselen og den koden som tolker svaret. En forutsetning er at vi kjenner den informasjonen som er beskrevet ovenfor for en Webservice. Visual Studio hjelper oss å lage en slik beskrivelse som er tilgjengelig via et Web-grensesnitt. Koden over er en kopi av det vi få vite dersom vi "slår opp" beskrivelsen for en av tjenestene til Webservicen "Dagens latinske ordtak", beskrevet i modulen Latin.

Sjekk dennehttp://donau.hiof.no/borres/dn/service1/Service.asmx

Programmeringen blir imidlertid fort ganske komplisert dersom tjenesten er mer komplisert med parametere og data i ulike formater. Visual studio er svært hjelpsom når det gjelder både å lage og å bruke Webservices. Hovedprinsippet på brukersiden er at det opprettes en "proxy"-klasse som tar seg av kommunikasjonen og som er en lokal klasse som vi kan kommunisere med på vanlig måte, kalle metoder osv. Denne hjelpklassen går i mellom og skjuler detaljene i kommunikasjonen for oss. Den blir en slags agent.

WSDL

For at det skal være mulig å generaliseredenne problemstillingen må webservices beskrives på en standardisert måte. Verktøyet for dette er WSDL. Sett i det perspektivet vi nevnte over så må en WSDL-fil inneholde den informasjonen som er nødvendig for å bygge en slik "proxy"-klasse som Visual Studio hjelper oss å gjøre.

WSDL er også en forutsetning for UDDI (Universal Description, Discovery and Integration). UDDI er et intiativ for kartlegging og organisering av Webservices. UDDI er, i motsetning til SOAP og WSDL, ikke et W3C initiativ.

En WSDL for tjenesten "Dagens latinske ordtak" som er beskrevet i modulen Latin ser slik ut:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
                  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
                  xmlns:tns="http://www.donau.hiof.no/borres/dn/demosite1/s1/" 
                  xmlns:s="http://www.w3.org/2001/XMLSchema" 
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
                  targetNamespace="http://www.donau.hiof.no/borres/dn/demosite1/s1/" 
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" 
              targetNamespace="http://www.donau.hiof.no/borres/dn/demosite1/s1/">
      <s:element name="HelloWorld">
        <s:complexType />
      </s:element>
      <s:element name="HelloWorldResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" 
                       name="HelloWorldResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="Dagens">
        <s:complexType />
      </s:element>
      <s:element name="DagensResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" 
                       name="DagensResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="HelloWorldSoapIn">
    <wsdl:part name="parameters" element="tns:HelloWorld" />
  </wsdl:message>
  <wsdl:message name="HelloWorldSoapOut">
    <wsdl:part name="parameters" element="tns:HelloWorldResponse" />
  </wsdl:message>
  <wsdl:message name="DagensSoapIn">
    <wsdl:part name="parameters" element="tns:Dagens" />
  </wsdl:message>
  <wsdl:message name="DagensSoapOut">
    <wsdl:part name="parameters" element="tns:DagensResponse" />
  </wsdl:message>
  <wsdl:portType name="ServiceSoap">
    <wsdl:operation name="HelloWorld">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        Returnerer en enkel text: Hallo alle sammen
      </wsdl:documentation>
      <wsdl:input message="tns:HelloWorldSoapIn" />
      <wsdl:output message="tns:HelloWorldSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="Dagens">
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        Returnerer et tilfeldig latinsk sitat og en kort forklaring, skilt med ;. 
        Returnerer ERROR;forklaring dersom data ikke er tilgjengelige
      </wsdl:documentation>
      <wsdl:input message="tns:DagensSoapIn" />
      <wsdl:output message="tns:DagensSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="HelloWorld">
      <soap:operation soapAction=
                      "http://www.donau.hiof.no/borres/dn/demosite1/s1/HelloWorld" 
                      style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Dagens">
      <soap:operation soapAction=
                      "http://www.donau.hiof.no/borres/dn/demosite1/s1/Dagens" 
                      style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="HelloWorld">
      <soap12:operation 
        soapAction="http://www.donau.hiof.no/borres/dn/demosite1/s1/HelloWorld" 
        style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="Dagens">
      <soap12:operation 
        soapAction="http://www.donau.hiof.no/borres/dn/demosite1/s1/Dagens" 
        style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="Service">
    <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
      <soap:address location="http://donau.hiof.no/borres/dn/service1/Service.asmx" />
    </wsdl:port>
    <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12">
      <soap12:address location="http://donau.hiof.no/borres/dn/service1/Service.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Dette er ikke et format som innbyr til intuitiv programmering. Men Visual Studio har altså innebygde mekanismer som greier å lage en programmerings API mot en webservice som er beskrevet slik, i form av en proxy-klasse.

En enkel webservice
En enkel webservice
Bruk av en webservice med værobservasjoner
En enkel webservice for surveys

Referanser

  1. WSDL, Web Service Description languagewww.w3.org/TR/wsdl14-03-2010
  1. SOAP,Simple Object Access Protocolwww.w3.org/TR/soap12-part0/14-03-2010
  1. WebserviceX.NETwww.webservicex.net/WS/default.aspx14-03-2010
  1. UDDI, Universal Description, Discovery, and Integrationuddi.xml.org/14-03-2010
(Velkommen) Moduler>Webservices (Latin)