Budowa aplikacji sieciowych. Usługi WWW dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.pl
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. // [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; public Silnia() { this.url = "http://localhost/silnia.asmx";
Plik silnia.cs,cd. 1 public event silniacompletedeventhandler silniacompleted; [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])); public System.IAsyncResult Beginsilnia(int n, System.AsyncCallback callback, object asyncstate) { return this.begininvoke("silnia", new object[] { n, callback, asyncstate); public int Endsilnia(System.IAsyncResult asyncresult) { object[] results = this.endinvoke(asyncresult); return ((int)(results[0])); public void silniaasync(int n) { this.silniaasync(n, null);
Plik silnia.cs, cd. 2. 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)); public new void CancelAsync(object userstate) { base.cancelasync(userstate);
Plik silnia.cs, cd. 3. [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void silniacompletedeventhandler(object sender, silniacompletedeventargs e); [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; 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