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

Podobne dokumenty