Kurs: XML tehnologije i veb servisi
Modul: Distribuirane aplikacije
Autor: Vladimir Marić
Naziv jedinice: Tehnologije XML veb servisa
Materijali vezani uz ovu lekciju:
-
Test tehnologije xml veb servisa -
Tehnologije XML veb servisa (PDF dokument)
Tehnologije XML veb servisa
Tri osnovne tehnologije na kojima su bazirani XML veb servisi su: HTTP (Hypertext Transfer Protocol), Extensible Markup Language (XML), Simple Object Access Protocol (SOAP).
.NET framework obezbeduje podršku za ove tehnologije.
Osnove HTTP-a
HTTP je standardni protokol (W3C) za prenos dokumenta putem Interneta. Lokacija resursa na internetu se vrši preko mehanizma koji se naziva URL (Uniform Resource Locator).
Podrazumevani port za HTTP je port 80. HTTP je protokol bez stanja, kada klijent dobije odgovor na zahtev, konekcija na server se zatvara.
Struktura HTTP zahteva
Na slici 1. je prikazana opšta struktura HTTP zahteva. Ispod toga se nalazi primer HTTP zahteva.
Slika 1. Struktura i primer HTTP zahteva
Struktura HTTP odgovora
Na slici 2. je prikazana opšta struktura HTTP odgovora. Ispod se nalazi primer HTTP odgovora.
Slika 2. Struktura HTTP odgovora
HTTP GET zahtev
Nema tela poruke. Query String je deo HTTP zahteva koji se nalazi iza znaka pitanja.
Velicina ovog stringa je ogranicena na 1024 bajta. Odgovor na HTTP GET zahtev je standardni HTTP odgovor.
HTTP POST zahtev
Query String nije deo URL–a. informacije o zahtevu se nalaze u telu poruke. Pogodan je za slanje vece kolicine podataka ka serveru.
.NET klase za rad sa HTTP-om
U prostoru imena System.Veb nalaze se klase HttpWebRequest i HttpWebResponse. Ove klase omogucavaju jednostavan pristup http hederima. Klasa HttpWebRequest podržava sinhroni i asinhroni zahtev. Klase StreamReader i StreamWriter se koriste za citanje i kreiranje razlicitih tokova.
XSD šeme
XSD šema je dokument koji opisuje strukturu XML dokumenta. XSD šema se sastoji od elemenata koji su prosti tipovi ili kompleksni tipovi. Kompleksni elementi pored atributa mogu da sadrže i elemente potomke. Unutar WSDL dokumenta definišu se XSD šeme koje opisuju tipove podataka i strukturu dokumenta.
Definisanje elemenata
Unutar xsd dokumenta potrebno je definisati tipove podataka pojedinih elemenata. U primeru na slajdu definisan je element Iznos koji je tipa xs:double i dozvoljene su null vrednosti. Pored ugradenih tipova podataka moguce je definisati i sopstvene tipove podataka.
Definisanje prostog tipa podataka
U primeru koji sledi definisan je prost tip podataka pod nazivom acctTypeCode. Ovaj tip podataka predstavlja stringove dužine dva karaktera. Zatim je definisan element tipRacuna koji je tipa acctTypeCode.
<xsd:simpleType name="acctTypeCode">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="tipRacuna" type="acctTypeCode"/>
Definisanje kompleksnog tipa podataka
Na ovom primeru je pokazan primer definisanja kompleksnog tipa podataka pod nazivom acct. Ovaj tip podataka se sastoji od uredene sekvence elemenata prostog tipa. Na kraju je definisan element Account tipa acct. Na slajdu je data i jedna instanca ovog elementa (deo XML dokumenta).
<xsd:complexType name="acct">
<xsd:sequence>
<xsd:element name="description type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="type" type="xsd:string"/>
<xsd:element name="balance" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="status" type="xsd:string"/>
</xsd:complexType>
<xsd:element name="account" type="acct"/>
<account status="active">
<number>1234-5X</number>
<type>CK</type>
<balance>5000.00</balance>
</account>
Grupe elemenata (atributa)
Grupe elemenata (atributa) se koriste za definisanje kompleksnih tipova podataka. U ovom primeru je definisana grupa elemenata pod nazivom acct, a zatim se posredstvom nje definiše kompleksni tip podataka checkingAcct.
<xsd:group name="acct">
<xsd:sequence>
<xsd:element name="description"type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
<xsd:element name="type" type="acctTypeCode"/>
<xsd:element name="balance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:group>
<xsd:complexType name="checkingAcct">
<xsd:sequence>
<xsd:group ref="acct" />
</xsd:sequence>
<xsd:attribute name="status"type="xsd:string"/>
</xsd:complexType>
Kompozitori
Kompozitori su elementi koji specificiraju sekvencijalni, disjunktivni ili konjuktivni raspored elemenata. Sekvenca elemenata oznacava se sa xsd:sequence i predstavlja uredenu sekvencu elemenata potomaka. Disjunktivni raspored elemenata (izbor jedne od više mogucnosti) oznacava se sa xsd:choice. Konjuktivni raspored elemenata oznacava se sa xsd:all predstavlja i neuredenu listu elemenata.
xsd:choice
U ovom primeru je prikazan primer kompozitora xsd:choice. Dozvoljava da se samo jedan element definisan unutar kompleksnog tipa pojavi u instanci tog elementa. U primeru na slajdu u instanci XML dokumenta koji implementira prikazanu šemu definiše se ili element Fullname ili se definiše sekvenca koja se sastoji od elemenata Firstname, Middleinitial, Lastname.
<xsd:complexType name="customerName">
<xsd:choice>
<xsd:element name="fullname" type="xsd:string" />
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string" />
<xsd:element name="middleinitial" type="xsd:string" minOccurs="0" />
<xsd:element name="lastname" type="xsd:string" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
xsd:all
Dozvoljava da se svi elementi unutar kompleksnog tipa pojave u instanci i to u proizvoljnom redosledu. Definiše neuredenu listu elemenata grupa ili kompozitora.
SOAP
Simple Object Access Protocol (SOAP) je protokol koji se koristi za razmenu informacija u decentralizovanom distribuiranom okruženju. Razmena SOAP poruka je uobicajeni nacin komunikacije sa veb servisima. SOAP poruka se sastoji:
<Envelope> sekcije,
<Body> sekcije,
<Header> sekcije koja je opciona.
Struktura SOAP poruke
Na slici 3. je prikazana struktura SOAP poruke.
Slika 3. Struktura SAOP poruke
Struktura SOAP poruke
SOAP omotac (Envelope) je koreni elemenat XML dokumenta koji predstavlja SOAP poruku. Opciono sadrži Header i Body elemente. SOAP Heder omogucava da se obezbede dodatne informacije o poruci, npr autentifikacioni podaci. Ako SOAP Envelope elemenat ne sadrži Heder element, onda Body element mora biti prvi element potomak. Body element može da sadrži emente potomke koji se nazivaju ulazi u telo. Body deo SOAP poruke sadrži podatke koji su karakteristicni za poziv metode. Opcioni deo Body elementa je SOAP Fault.
SOAP greška (Fault) elemenat sadrži informacije o greškama i ima 4 elementa potomka koji predstavljaju kod greške, string greške tj. objašnjenje uzrocnika greške tj. ko je uzrokovao tekucu grešku i detalje o grešci.
SOAP omotac i telo
SOAP telo se koristi za definisanje metode koju klijent veb servisa poziva kao i za slanje odgovora klijentu. U primeru na slajdu SOAP omotac se koristi za slanje autentifikacionih podataka.
soap:Fault
Koristi se da se korisniku veb servisa pošalju informacije o grešci nastaloj prilikom poziva veb servisa. Ovaj element predstavlja jedan od ulaza u SOAP telo i predstavlja opcioni element. U ovom primeru je prikazan primer ovog elementa, prikazan je kod greške kao i dodatni podaci o samoj grešci.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Body>
<soap:Fault>
<faultcode>123XYZ</faultcode>
<faultstring>Server Error</faultstring>
<detail>
<bank:faultdetails xmlns:bank="urn:OnlineBank">
<message>Your account is overdrawn</message>
<errorcode>1234</errorcode>
</bank:faultdetails>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Primer SOAP zahteva
Posredstvom SOAP protokola zahteva se izvršavanje metode pod nazivom 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://tempuri.org/” />
</soap:Body>
</soap:Envelope>
Primer SOAP odgovora
U sledecem primeru je prikazan odgovor veb servisa na SOAP zahtev, tj. SOAP odgovor na metodu HelloWord. Metoda vraca string Hello World.
<?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://tempuri.org/”>
<HelloWorldResult>Hello World</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>