Protokol SOAP.
Transkrypt
Protokol SOAP.
Budowa aplikacji sieciowych. Usługi WWW dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole [email protected] Usługi WWW W3C Working Group, ‘Web Services Architecture’, Note 11 February 2004. Usługa WWW (ang. web service) jest systemem aplikacyjnym zaprojektowanym w celu wspamagania wymiany danych między węzłami w sieciach komputerowych. System aplikacyjny usługi WWW posiada interfejs zaprojektowany w języku WSDL. Inne systemy aplikacyjne wymieniają wiadomości z systemem usługi WWW za pomocą protokołu SOAP, tzn. wiadomości przesyłane są za pomocą protokołu HTTP, dane są w formacie XML. Formalną definicję usługi WWW można znaleźć w specyfikacji języka WSDL http://www.w3.org/TR/wsdl () Usługa WWW korzysta z następujących protokołów i standardów: • HTTP (ang. HyperText Transfer Protocol) • HTML (ang. HyperText Markup Language) • SOAP (ang. Simple Object Access Protocol) • XML (ang. eXtensible Markup Language) (xml, xml dtd, xml schema) • WSDL (ang. Web Services Description Language) • UDDI (ang. Universal Description, Discovery and Integration) Simple Object Access Protocol (SOAP) SOAP jest protokolem służącym aplikacjom sieciowym na wymianę danych w protokole HTTP w których struktura danych określona jest w formacie XML. SOAP jest elementem architektury projektu Microsoft .NET. Większość aplikacji sieciowych komunikuje się w Internecie wykorzystując standardowe komponenty takie, jak obiekty DCOM, obiekty CORBA. Obiekty te korzystają z protokolu RPC (ang. Remote Procedure Calls). Wadą tego sposobu komunikacji jest to, że firewalle i serwery proxy blokują tego typu komunikację. Firewalle i serwery proxy zazwyczaj nie blokują komunikacji w protokole HTTP, tzn. port nasłuchiwania serwera WWW jest zazwyczaj otwarty. Protokół SOAP zostal stworzony przez firmę Microsoft w celu wymiany danych w protokole HTTP i formacie XML. Simple Object Access Protocol (SOAP) Cechy protokołu SOAP • jest protokołem warstwy aplikacji w modelu OSI, • jest protokołem zaprojektowanym do komunikacji w Internecie, • definiuje format przesyłanych wiadomości, • jest protokołem niezależnym od platformy systemowej, • jest niezależny od języka implementacji usługi WWW, • jest oparty o język XML, • nie jest blokowany przez firewall’e. Wiadomość SOAP ma strukturę dokumentu XML i zawiera następujące elementy (tagi): • envelope, zawiera treść wiadomości, • header, element opcjonaly, zawiera informacje nagłówkowe, • body, zawiera zapytanie i odpowiedź. Simple Object Access Protocol (SOAP) Podstawowe zasady skladni protokolu SOAP: • wiadomość SOAP musi być w formacie XML, • wiadomość SOAP musi zawierać tag SOAP Envelope, • wiadomość SOAP może zawierać tag SOAP Header, • wiadomość SOAP musi zawierać tag SOAP Body, • wiadomość SOAP musi korzystać z obszaru nazw SOAP Envelope, • wiadomość SOAP musi korzystać z obszaru nazw SOAP encoding, • wiadomość SOAP nie musi zawierać odnośnikow do dokumentow DTD, • wiadomość SOAP nie musi zawierać instrukcji xml (ang. XML Processing Instructions). Przykład: struktura widomości SOAP. Pełna struktura widomości SOAP opisana jest w specyfikacji SOAP http://www.w3.org/TR/soap/ http://www.w3.org/TR/soap12-part1/ <soap:Envelope> <soap:Body> <NazwaTagu1> <Element1> … </Element1> </NazwaTagu1> </soap:Body> </soap:Envelope> XML - eXtensible Markup Language Język XML jest znakowym językiem opartym o tagi. Tagiem jest element rozpoczynający się od znaku < > i kończący się znakiem </ >. Tagi mogą posiadać atrybuty, atrybuty posiadają wartości. Np. <nazwa_tagu atrybut=”wartość” > … </ nazwa_tagu> Tagi języka XML nie są zdefiniowane, tagi definiuje użytkownik. Do opisu danych w języku XML służą dokumenty DTD (ang. Document Type Definition) lub dokumenty XML Schema. Różnica między językiem html i językiem xml: • język html służy do formatowania i prezentacji danych (np. formatowania tekstu, wyboru typu, koloru czcionki, zagnieżdżania obiektów np.gif, odnośników) • język xml służy do definiowania struktury danych i transmisji danych. W języku html dane i informacje o strukturze strony WWW zawarte są w tym samym dokumencie (w tym samym pliku). Język xml został stworzony do oddzielenia danych od informacji definiujących sposób (format) prezentacji tych danych. XML - eXtensible Markup Language Cechy języka xml: • dane muszą być między tagami, • dokument xml musi zawierać tag główny (ang. root tag), • tagi muszą być prawidłowo zagnieżdżone np. <a> …. <b> … </b> ….. </a>, • wartości atrybutów w tagach zawsze muszą być w cudzysłowach np. <font size=”50” > … </font> np. <img src=”http://www.abc.com”> …. </img>, • poprawny dokument xml musi zawierać deklaracje <?xml version="1.0" encoding="ISO-8859-1"?>, • język xml uwzględnia spacje między znakami, w definicji tagów rozróżniane są duże i małe litery. Zasady nadawania nazw tagom: • nazwa tagu może zawierać litery, cyfry • nazwa tagu nie może zaczynać sie od: cyfry, - , . • nazwa tagu nie może zaczynać sie od słowa: xml, XML, Xml, … . • w nazwie tagu nie może być: spacji, :. XML - eXtensible Markup Language Plik ksiazki.xml <?xml version="1.0" ?> <ListaKsiazek> <Ksiazka Gatunek="Poezja" DataPublikacji="1981" ISBN="1-86103-11-0"> <TytulKsiazki> Pan T. </TytulKsiazki> <ImieAutora> A </ImieAutora> <NazwiskoAutora> M </NazwiskoAutora> <Cena> 5,50 </Cena> </Ksiazka> <Ksiazka Gatunek="Literatura" DataPublikacji="1967" ISBN="0-201-63361-2"> <TytulKsiazki> O i M </TytulKsiazki> <ImieAutora> H </ImieAutora> <NazwiskoAutora> S </NazwiskoAutora> <Cena> 101,01 </Cena> </Ksiazka> <Ksiazka> Gatunek="Filozofia" DataPublikacji="1991" ISBN="1-861001-57-6"> <TytulKsiazki> Dialogi </TytulKsiazki> <NazwiskoAutora> Platon </NazwiskoAutora> <Cena> 20,99 </Cena> </Ksiazka> </ListaKsiazek> Plik ksiazki.html <html> <head> <title> </title> <xml id="dsKsiazka" src="ksiazki.xml"> </xml> </head> <body> <table border="1" datasrc="#dsKsiazka"> <thead> <tr> <th> Tytul </th> <th> Imie </th> <th> Nazwisko </th> <th> Cena </th> </tr> </thead> <tbody> <tr> <td> <span datafld="TytulKsiazki"> </span> </td> <td> <span datafld="ImieAutora"> </span> </td> <td> <span datafld="NazwiskoAutora"> </span> </td> <td> <span datafld="Cena"> </span> </td> </tr> </tbody> </table> </body> </html> WSDL - Web Services Description Language Dokument WSDL • służy do opisu usługi WWW. • umożliwia odnalezienie usługi WWW w Internecie. • jest dokumentem XML. Specyfikacja języka WSDL znajduje się pod adresem http://www.w3.org/TR/wsdl/ Struktura dokumentu WSDL: <portType> operacje wykonywane przez usługę WWW. <message> wiadomosci wykorzystywane przez usługę WWW. <types> typy danych wykorzystywane przez usługę WWW. <binding> protokoly komunikacyjne wykorzystywane przez usługę WWW. Przykład. Prosty dokument wsdl. <definitions> <types> definition of types........</types> <message> definition of a message....</message> <portType> definition of a port.......</portType> <binding> definition of a binding....</binding> </definitions> UDDI - Universal Description, Discovery and Integration Specyfikacja dostępna jest na stronie http://uddi.xml.org/ https://www.oasis-open.org/standards#uddiv3 Standard opisu i wyszukiwania • usług WWW, • dostarczycieli usług WWW, • interfejsów umożliwiających dostęp do usług WWW. Usługa WWW: silnia 1. Uruchomić serwer WWW (Microsoft IIS). 2. Umieścić w katalogu \wwwroot\ plik silnia.asmx (C:\Inetpub\wwwroot\silnia.asmx ) 3. Utworzyć Web Service Proxy. \>wsdl http://adresSerweraWWW/silnia.asmx wynik: silnia.cs 4. Utworzyć dynamicznie dołączaną bibliotekę silnia.dll, tzn. skompilować plik silnia.cs. C:\Inetpub\wwwroot >csc /t:library silnia.cs wynik: silnia.dll 5. Skompilować program SilniaTest.cs z linkiem do biblioteki silnia.dll C:\Inetpub\wwwroot> csc /r:silnia.dll SilniaTest.cs Rezultat: SilniaTest.exe 6. Test usługi WWW. Uruchomić program SilniaTest.exe (plik silnia.dll umieścić w tym samym katalogu co SilniaTest.exe). C:\> SilniaTest.exe 8 Rezultat: C:\> Usluga silnia. 8! = 40320 Usługa silnia Plik silnia.asmx <%@ WebService Language="c#" Class="Silnia"%> using System; using System.Web.Services; [WebService(Namespace="http://localhost/")] public class Silnia : WebService { [WebMethod] public int silnia(int n) { if (n == 0) return 1; else return (n * silnia(n - 1)); } } Usługa silnia Usługa silnia Usługa silnia Plik silnia.cs //-----------------------------------------------------------------------------// <auto-generated> // This code was generated by a tool. // Runtime Version:2.0.50727.3603 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //-----------------------------------------------------------------------------using System; using System.ComponentModel; using System.Diagnostics; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Serialization; // // This source code was auto-generated by wsdl, Version=2.0.50727.3038. // /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name="SilniaSoap", Namespace="http://localhost/")] public partial class Silnia : System.Web.Services.Protocols.SoapHttpClientProtocol { private System.Threading.SendOrPostCallback silniaOperationCompleted; /// <remarks/> public Silnia() { this.Url = "http://localhost/silnia.asmx"; } Plik silnia.cs ,cd. 1 /// <remarks/> public event silniaCompletedEventHandler silniaCompleted; /// <remarks/> [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://localhost/silnia", RequestNamespace="http://localhost/", ResponseNamespace="http://localhost/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public int silnia(int n) { object[] results = this.Invoke("silnia", new object[] { n}); return ((int)(results[0])); } /// <remarks/> public System.IAsyncResult Beginsilnia(int n, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("silnia", new object[] { n}, callback, asyncState); } /// <remarks/> public int Endsilnia(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } /// <remarks/> public void silniaAsync(int n) { this.silniaAsync(n, null); } Plik silnia.cs, cd. 2. /// <remarks/> public void silniaAsync(int n, object userState) { if ((this.silniaOperationCompleted == null)) { this.silniaOperationCompleted = new System.Threading.SendOrPostCallback(this.OnsilniaOperationCompleted); } this.InvokeAsync("silnia", new object[] { n}, this.silniaOperationCompleted, userState); } private void OnsilniaOperationCompleted(object arg) { if ((this.silniaCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.silniaCompleted(this, new silniaCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } /// <remarks/> public new void CancelAsync(object userState) { base.CancelAsync(userState); } } Plik silnia.cs, cd. 3. /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void silniaCompletedEventHandler(object sender, silniaCompletedEventArgs e); /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] public partial class silniaCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; internal silniaCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; } /// <remarks/> public int Result { get { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } Program SilniaTest.cs z linkiem do biblioteki silnia.dll Plik SilniaTest.cs using System; class SilniaTest { public static void Main(string[] argv) { Silnia ms = new Silnia(); int n = Convert.ToInt16(argv[0]); int wynik = ms.silnia(n); Console.WriteLine("Usługa silnia. {0}! = {1}",n, wynik ); } } Program SilniaTest.cs z linkiem do biblioteki silnia.dll