Integracja aplikacji Wykład 2 Piotr Czapiewski Wydział Informatyki ZUT Integracja aplikacji Wykład 2
Web services
Web services – usługi sieciowe Definicja według W3C: A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web service in a manner prescribed by its description using SOAP-messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards. http://www.w3.org/TR/ws-gloss/
Rodzaje usług sieciowych Web Services Big Web Services RESTful Web Services XML, SOAP, WSDL
Architektura usług sieciowych Strony kontraktu Dostawca usług (Service Provider) Klient usługi (Service Requester) Broker, pośrednik (Service Broker) Stosowane protokoły WSDL SOAP UDDI
Architektura usług sieciowych Jeden dostawca, wielu klientów
Protokół SOAP Klient Web service Dawna nazwa: Simple Object Access Protocol Protokół wymiany informacji pomiędzy aplikacjami Oparty na XML Niezależny od platformy i języka programowania Transmisja zwykle za pośrednictwem protokołu HTTP (łatwe przejście przez firewalle i proxy) Klient Web service SOAP
Protokół SOAP SOAP Envelope SOAP Header SOAP Body Komunikat SOAP = dokument XML Części składowe komunikatu SOAP Envelope – identyfikacja dokumentu jako komunikatu SOAP Header – informacje nagłówkowe Body – właściwa treść żądania/odpowiedzi Fault – informacje o błędach i statusie SOAP Envelope SOAP Header SOAP Body
Szkielet komunikatu SOAP <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
Komunikat SOAP Przykłady komunikatów SOAP – żądanie <?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> <CelsiusToFahrenheit xmlns="http://tempuri.org/"> <Celsius>37</Celsius> </CelsiusToFahrenheit> </soap:Body> </soap:Envelope>
Komunikat SOAP w żądaniu HTTP POST /webservices/tempconvert.asmx HTTP/1.1 Host: www.w3schools.com Content-Type: text/xml; charset=utf-8 Content-Length: 234 SOAPAction: "http://tempuri.org/CelsiusToFahrenheit" <?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> <CelsiusToFahrenheit xmlns="http://tempuri.org/"> <Celsius>37</Celsius> </CelsiusToFahrenheit> </soap:Body> </soap:Envelope>
SOAP w praktyce Klient Web service Biblioteki SOAP Biblioteki SOAP SOAP: żądanie Biblioteki SOAP SOAP: odpowiedź
Standard WSDL Web Service Description Language Język oparty na XML Model opisu usług sieciowych Definicja: usług dostępnych pod danym adresem operacji udostępnianych przez usługi parametrów wejściowych i wyjściowych operacji
Dokument WSDL <message name="ktoraGodzina"></message> <message name="ktoraGodzinaResponse"> <part name="return" type="xsd:string"></part> </message> <message name="zakukaj"> <part name="arg0" type="xsd:int"></part> <message name="zakukajResponse"> <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.dyda.pc/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.dyda.pc/" name="ZegarynkaService"> <types></types> <message name="ktoraGodzina"></message> <message name="ktoraGodzinaResponse"> <part name="return" type="xsd:string"></part> </message> <message name="zakukaj"> <part name="arg0" type="xsd:int"></part> <message name="zakukajResponse"> <portType name="IZegarynka"> <operation name="ktoraGodzina" parameterOrder=""> <input message="tns:ktoraGodzina"></input> <output message="tns:ktoraGodzinaResponse"></output> </operation> <operation name="zakukaj" parameterOrder="arg0"> <input message="tns:zakukaj"></input> <output message="tns:zakukajResponse"></output> </portType> <binding name="ZegarynkaPortBinding" type="tns:IZegarynka"> ... </binding> <service name="ZegarynkaService"> <port name="ZegarynkaPort" binding="tns:ZegarynkaPortBinding"> <soap:address location="http://localhost:9876/zegarynka"></soap:address> </port> </service> </definitions> <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.dyda.pc/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.dyda.pc/" name="ZegarynkaService"> <types></types> <message name="ktoraGodzina"></message> <message name="ktoraGodzinaResponse"> <part name="return" type="xsd:string"></part> </message> <message name="zakukaj"> <part name="arg0" type="xsd:int"></part> <message name="zakukajResponse"> <portType name="IZegarynka"> <operation name="ktoraGodzina" parameterOrder=""> <input message="tns:ktoraGodzina"></input> <output message="tns:ktoraGodzinaResponse"></output> </operation> <operation name="zakukaj" parameterOrder="arg0"> <input message="tns:zakukaj"></input> <output message="tns:zakukajResponse"></output> </portType> <binding name="ZegarynkaPortBinding" type="tns:IZegarynka"> ... </binding> <service name="ZegarynkaService"> <port name="ZegarynkaPort" binding="tns:ZegarynkaPortBinding"> <soap:address location="http://localhost:9876/zegarynka"></soap:address> </port> </service> </definitions> <portType name="IZegarynka"> <operation name="ktoraGodzina" parameterOrder=""> <input message="tns:ktoraGodzina"></input> <output message="tns:ktoraGodzinaResponse"></output> </operation> <operation name="zakukaj" parameterOrder="arg0"> <input message="tns:zakukaj"></input> <output message="tns:zakukajResponse"></output> </portType> <service name="ZegarynkaService"> <port name="ZegarynkaPort" binding="tns:ZegarynkaPortBinding"> <soap:address location="http://localhost:9876/zegarynka"></soap:address> </port> </service>
Klient usługi sieciowej Przykłady
Klient usługi sieciowej – przykłady Przykład wykorzystania usługi sieciowej Usługa TempConvert http://www.w3schools.com/webservices/tempconvert.asmx Adres dokumentu WSDL http://www.w3schools.com/webservices/tempconvert.asmx?WSDL Udostępniane funkcje CelsiusToFahrenheit (wejście: string; wyjście: string) FahrenheitToCelsius (wejście: string; wyjście: string)
Klient usługi sieciowej – .NET, C#
Klient usługi sieciowej – .NET, C#
Klient usługi sieciowej – .NET, C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using WindowsApplication1.com.w3schools.www; namespace WindowsApplication1 { public partial class Form1 : Form public Form1() InitializeComponent(); } private void button1_Click(object sender, EventArgs e) string c = celsTB.Text; TempConvert service = new TempConvert(); string f = service.CelsiusToFahrenheit(c); fahrTB.Text = f;
Klient usługi sieciowej – Java
Klient usługi sieciowej – Java
Klient usługi sieciowej – Java package tempconvertclient; import org.tempuri.TempConvert; import org.tempuri.TempConvertSoap; public class Main { public static void main(String[] args) { String s = "37.5"; TempConvertSoap tempConv = new TempConvert().getTempConvertSoap(); String f = tempConv.celsiusToFahrenheit(s); System.out.println(f); }
Klient usługi sieciowej – PHP $url = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL"; $client = new SoapClient($url); $res = $client->CelsiusToFahrenheit(array("Celsius" => "37.5")); print $res->CelsiusToFahrenheitResult; ?>
Implementacja usługi sieciowej Java, JAX-WS
Implementacja usługi sieciowej Usługa Zegarynka Zaimplementowana zostanie usługa udostępniająca dwie metody: String ktoraGodzina() String zakukaj(int ileRazy) Uproszczona implementacja z wykorzystaniem JAX-WS Wymagania: Java SE 6 Java SE 5 + Metro Web Services Stack Adnotacje (annotations) @WebService – oznaczenie klasy implementującej web service @WebMethod – oznaczenie metody udostępnianej przez web service
Implementacja usługi sieciowej package pc.dyda.ws; import java.util.Calendar; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Zegarynka { @WebMethod public String ktoraGodzina() { ... } public String zakukaj(int ileRazy) {
Implementacja usługi sieciowej @WebMethod public String ktoraGodzina() { return Calendar.getInstance().getTime().toString(); } public String zakukaj(int ileRazy) { StringBuilder sb = new StringBuilder(); for(int i=0; i<ileRazy; i++) sb.append("kuku"); return sb.toString();
Implementacja usługi sieciowej Uruchomienie usługi Klasa Endpoint, metoda publish() Parametry: adres url, pod którym dostępna ma być usługa obiekt klasy implementującej usługę package pc.dyda; import javax.xml.ws.Endpoint; import pc.dyda.ws.Zegarynka; public class Uslugodawca { public static void main(String[] args) { String url = "http://localhost:9876/zegarynka"; Zegarynka zegar = new Zegarynka(); Endpoint.publish(url, zegar); }
Implementacja usługi sieciowej Uruchomienie usługi Klasa Endpoint, metoda publish() package pc.dyda; import javax.xml.ws.Endpoint; import pc.dyda.ws.Zegarynka; public class Uslugodawca { public static void main(String[] args) { String url = "http://localhost:9876/zegarynka"; Zegarynka zegar = new Zegarynka(); Endpoint.publish(url, zegar); }
Implementacja usługi sieciowej Uruchomienie usługi Uruchomienie klasy publikującej usługę (tutaj: pc.dyda.Uslugodawca) Z poziomu Netbeans: Run, F6 Z linii poleceń: java pc.dyda.Uslugodawca Test usługi Wejście przeglądarką na adres: http://localhost:9876/zegarynka?wsdl
Usługa sieciowa ze złożonymi typami danych package pc.ws; public class Student { private int numerAlbumu; private String imie; private String nazwisko; private String kierunek; private int rokStudiow; public Student() { } public Student(int nr, String imie, String nazwisko, String kierunek, int rok) { this.numerAlbumu = nr; this.imie = imie; this.nazwisko = nazwisko; this.kierunek = kierunek; this.rokStudiow = rok; } public String getImie() { return imie; } public void setImie(String imie) { this.imie = imie; } ... } JavaBean wymagany konstruktor bezargumentowy oraz gettery i settery
Usługa sieciowa ze złożonymi typami danych package pc.ws; import ... @WebService() public class Dziekanat { List<Student> studenci = new ArrayList<Student>(); public Dziekanat() { } @WebMethod public List<Student> listaStudentow() { return studenci; } @WebMethod public Student znajdzStudenta( @WebParam(name="imie") String imie, @WebParam(name="nazwisko") String nazwisko) { for (Student student : studenci) { if(student.getImie().equalsIgnoreCase(imie) && student.getNazwisko().equalsIgnoreCase(nazwisko)) return student; } return null; } } @WebService() public class Dziekanat { @WebMethod public List<Student> listaStudentow() { return studenci; } @WebMethod public Student znajdzStudenta( @WebParam(name="imie") String imie, @WebParam(name="nazwisko") String nazwisko) { for (Student student : studenci) { if(...) return student; } return null; }
Usługa sieciowa ze złożonymi typami danych Generowanie klas wrapperów XML Automatyczne, run-time Ręczne, za pomocą narzędzia wsgen: np. w przypadku projektu NetBeans: wsgen [opcje] nazwa klasy implementującej usługę wsgen -cp build/classes -s src -d build/classes -keep pc.ws.Dziekanat
Usługa sieciowa ze złożonymi typami danych Klient C# DziekanatClient d = new DziekanatClient(); student s = d.znajdzStudenta("Jan", "Kowalski"); label1.Text = s.numerAlbumu.ToString(); DziekanatClient d = new DziekanatClient(); student[] studenci = d.listaStudentow(); label1.Text = studenci.Length.ToString();
Usługa sieciowa ze złożonymi typami danych Komunikaty SOAP <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <znajdzStudenta xmlns="http://ws.pc/"> <imie xmlns="">Jan</imie> <nazwisko xmlns="">Kowalski</nazwisko> </znajdzStudenta> </s:Body> </s:Envelope> <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:znajdzStudentaResponse xmlns:ns2="http://ws.pc/"> <return> <imie>Jan</imie> <kierunek>zoologia</kierunek> <nazwisko>Kowalski</nazwisko> <numerAlbumu>111</numerAlbumu> <rokStudiow>3</rokStudiow> </return> </ns2:znajdzStudentaResponse> </S:Body> </S:Envelope>
Usługa sieciowa ze złożonymi typami danych Komunikaty SOAP <?xml version="1.0"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:listaStudentowResponse xmlns:ns2="http://ws.pc/"> <return> <imie>Jan</imie> <kierunek>zoologia</kierunek> <nazwisko>Kowalski</nazwisko> <numerAlbumu>111</numerAlbumu> <rokStudiow>3</rokStudiow> </return> <imie>Gal</imie> <kierunek>informatyka</kierunek> <nazwisko>Anonim</nazwisko> <numerAlbumu>123</numerAlbumu> <rokStudiow>4</rokStudiow> ... </ns2:listaStudentowResponse> </S:Body> </S:Envelope> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <listaStudentow xmlns="http://ws.pc/" /> </s:Body> </s:Envelope>