You are on page 1of 36

FAKULTET ORGANIZACIONIH NAUKA

LABORATORIJA ZA ELEKTRONSKO POSLOVANJE

INTERNET TEHNOLOGIJE

SOAP veb servisi


SADRŽAJ
1 Servisno orijentisana arhitektura i veb servisi ..................................................................... 3
2 SOAP veb servisi ............................................................................................................... 4
2.1 Karakteristike SOAP veb servisa ................................................................................. 4
2.2 Korišćenje SOAP veb servisa ...................................................................................... 5
2.3 Osnovni standardi SOAP veb servisa .......................................................................... 7
2.3.1 SOAP ................................................................................................................... 7
2.3.2 WSDL ................................................................................................................... 8
2.3.3 UDDI ....................................................................................................................12
2.4 Razvoj i upotreba SOAP veb servisa u PHP ...............................................................13
2.5 SOAP veb servis klijent ...............................................................................................14
2.5.1 Pozivanje metode veb servisa bez parametara ....................................................14
2.5.2 Prikaz HTTP zahteva i odgovora u HTML-u .........................................................17
2.5.3 Pozivanje metode veb servisa sa parametrima ....................................................17
2.5.4 Primeri – SOAP veb servis klijenti ........................................................................19
2.6 Kreiranje sopstvenog SOAP veb servisa .....................................................................23
2.6.1 Primeri – SOAP veb servisi ..................................................................................23
2.7 Štampanje HTTP zahteva/odgovora ...........................................................................28

2
1 Servisno orijentisana arhitektura1 i veb servisi

Tipovi softverskih arhitektura razvijeni pre uvođenja koncepta veb servisa nisu dovoljno dobri za
obezbeđivanje osnovnih funkcionalnosti poslovne logike. Javljaju se problemi skalabilnosti,
pouzdanosti, interoperabilnosti i distribuiranosti.

Navedeni problemi su u velikoj meri otklonjeni uvođenjem koncepta SOA. Servisno orijentisana
arhitektura (SOA) predstavlja kolekciju servisa koji komuniciraju ili koordiniraju neke aktivnosti.
SOA odvaja funkcije u pojedinačne servise koji mogu biti distribuirani preko mreže i korišćeni u
kreiranju i upotrebi poslovnih aplikacija. Osnovni koncepti podržani u SOA su:
 Servisi
 Interfejsi
 Poruke
 Sinhrona i asinhrona komunikacija
 Slabo povezivanje
 Kompozicija servisa u poslovni proces

Servisi se mogu razvijati korišćenjem tradicionalnih jezika kao što su Java, C, C++, C#, Visual
Basic, PHP itd. Svaki servis predstavlja jednu zaokruženu celinu koja nudi neke zacrtane
funkcionalnosti bez oslanjanja na druge servise. Kada se želi razviti aplikacija korišćenjem SOA,
dovoljno je samo povezati dostupne servise na odgovarajući način. Ako su servisi definisani
tako da obavljaju male, nezavisne delove posla, biće moguće koristiti ih više puta kao delove
različitih aplikacija. Da bismo upotrebili neki servis u svojoj aplikaciji dovoljno je da poznajemo
njegov interfejs, kojim su opisane njegove funkcionalnosti i format poruka koja prihvata; sama
implementacija servisa i jezik u kojem je pisan su sakriveni od nas i nevažni za njegovo
korišćenje.

SOA se zasniva na konceptu veb servisa. Veb servisi su gradivni blokovi za izgradnju otvorenih
distribuiranih informacionih sistema.

Veb servis je bilo kakva funkcija (servis, usluga) koja je dostupna preko veb-a. Primer ovoga bi
bila bilo kakva PHP stranica koja za neke prosleđene parametre vraća neki rezultat – upravo
ono što svaka PHP stranica radi.

U kontekstu PHP-a, ono što razlikuje veb servis od veb aplikacije rađene u PHP-u je to što je
rezultat izvršenja veb aplikacije namenjen za prikaz u pretraživaču, u formatu čitljivom ljudima, a
rezultat veb servisa je namenjen drugim programima.

Danas postoji dva osnovna tipa veb servisa. SOAP veb servisi komuniciraju korišćenjem XML
poruka po SOAP standardu i čiji je interfejs definisan WSDL-om. Ovakvi servisi se još nazivaju i
„veliki“ veb servisi (Big veb services). Ovakvi servisi su strogo standardizovani, odnosno
razvijen je poseban protokol koji definiše kako izgledaju zahtevi i odgovori. Drugi tip veb servisa
jesu REST servisi. Oni podrazumevaju arhitekturni stil (ne standard) koji omogućava da se na
osnovu poslatog zahteva klijenta vrati odgovor servera u željenom, unapred definisanom

1Više informacija o teorijskim konceptima SOA i veb servisa se može pronaći u okviru prezentacije sa
predavanja SOA

3
formatu (XML, JSON, običan tekst ili drugi). U ovoj skripti će biti prikazana oba pristupa
problematici veb servisa.

2 SOAP veb servisi

2.1 Karakteristike SOAP veb servisa


Veb servisi predstavljaju skup:
 Standardnih Internet protokola za razmenu poruka
 Standarda za programiranje
 Mrežne podrške za registraciju i pronalaženje servisa koji izlažu svoje poslovne funkcije
autorizovanim grupama preko lnterneta.

Veb servis predstavlja bilo koji servis dostupan u distribuiranim okruženjima kao što je Internet
(ili intranet mreže), a koji koristi standardizovani XML sistem za razmenu poruka, te koji nije
isključivo vezan za bilo koji operativni sistem ili programski jezik.

Veb servisi se objavljuju na jedinstvenoj lokaciji i nude se kao usluge. Kako bi usluga bila
kompletna, nudi se i potpuna specifikacija interfejsa, poslovnih zahteva, kvaliteta servisa,
pravnih i finansijskih uslova korišćenja itd.

Pravu snagu veb servisa predstavlja mogućnost integracije različitih sistema i aplikacija putem
standardiziranog načina komunikacije. Veb servisi zapravo predstavljaju veb aplikacije koje
pružaju određenu funkcionalnost udaljenim programima. Veb servis je skup funkcija upakovan
kao jedinstven entitet i postavljen negde na Internetu da ad hoc služi drugim programima.

Neke od ključnih osobina veb servisa su [IBM SOA]:


 Veb servisi su samostalni. Na klijentskoj strani nije potreban dodatni softver. Dovoljan je
samo programski jezik sa XML i HTTP podrškom. Na serverskoj strani, potreban je veb
server.
 Veb servisi su samoopisujući. Definicija formata poruke se nalazi u samoj poruci. Nisu
potrebna nikakva dodatna skladišta za meta podatke, niti alati za njihovo kreiranje.
 Veb servisi su modularni.
 Veb servisi predstavljaju tehnologiju za isporučivanje i obezbeđivanje pristupa poslovnim
funkcijama preko veb-a; J2EE, CORBA, kao i drugi standarda koji predstavljaju
tehnologije za primenu veb servisa.
 Veb servisi mogu biti publikovani, locirani i pokrenuti preko veba. Za to su neophodni
sledeći standardi:
o Simple Object Access Protocol (SOAP)
o Web Service Description Language (WSDL)
o Universal Description, Discovery, and Integration (UDDI)
 Veb servisi su nezavisni od jezika i interoperabilni. Interakcija veb servisa i njegovog
klijenta je dizajnirana tako da bude nezavisna od platforme i jezika. Njihova interakcija
zahteva WSDL dokument za definiciju interfejsa i opis servisa, zajedno sa mrežnim
protokolom. Pošto ni veb servis, ni njegov klijent ne znaju međusobno na kojim se
platformama nalaze i pomoću kojeg jezika su kreirani, interoperabilnost je obezbeđena.

4
 Veb servisi su bazirani na otvorenim standardima. XML i HTTP predstavljaju tehničku
osnovu veb servisa. Veliki deo veb servis tehnologije je kreiran koristeći Open Source
projekte.
 Veb servisi su dinamički. Opis i pronalaženje veb servisa se mogu automatizovati preko
UDDI i WSDL.

Set veb servis protokola stalno se razvija i koristi se da definiše, otkriva i implementira veb
servise. Osnova ovih protokola leži u sledeća četiri nivoa :
 Service Transport: Ovaj nivo je odgovoran za prenos poruka između aplikacija i u njega
su trenutno uključeni HTTP, SMTP, FTP, i novi protokoli kao što je BEEP - Blocks
Extensible Exchange Protocol.
 XML Messaging: Ovaj nivo je odgovoran za razumevanje poruka za razmenjivanje koje
se implementiraju u XML formatu i trenutno se koristi XML-RPC (XML – Remote
Procedure Call) i SOAP (Simple Object Access Protocol).
 Service Description: Ovaj nivo definiše javni interfejs za određeni veb servis, i trenutno
se opisuje kroz WSDL (Web Service Description Language).
 Service Discovery: Ovaj nivo je odgovoran za centralizovanje servisa u zajednički i
jedinstveni registar koji obezbeđuje jednostavno objavljivanje i pronalaženje servisa.
Otkrivanje servisa trenutno se obrađuje kroz UDDI (Universal Description, Discovery,
and Integration).

2.2 Korišćenje SOAP veb servisa


Da bi veb servis mogao da bude upotrebljiv neophodno je ispoštovati određene korake:

1. Opisati servis pomoću WSDL jezika.

WSDL je zasnovan na XML i predstavlja opis interfejsa veb servisa koji treba da sadrži:

 Opis interakcije koju servis nudi


 Opis argumenata i rezultata koji su uključeni u interakciju
 Adresu za lociranje servisa
 Komunikacioni protokol
 Format podataka koji se koristi u porukama

Definisanje interfejsa je zapravo ugovor između servera i klijenta

2. Registrovati servis na UDDI registru, Internet lokaciji predviđenoj za objave servisa, i time
omogućiti i svom softveru da koristi tuđe usluge, i zainteresovanim korisnicima da pronađu vaš
servis.

UDDI predstavlja centralizovanu lokaciju koja obezbeđuje mehanizam za registrovanje i


pronalaženje servisa. Koristi SOAP za komunikaciju i omogućuje klijentima da pronađu servis i
serveru da ga objavi.

3. Omogućiti pristup svom veb servisu posredstvom SOAP-a, koji koristi XML jezik za
specificiranje pozivnih parametara i rezultata rada servisa.

5
SOAP predstavlja okruženje za razmenu poruka zasnovanih na XML-u u mreži. Sam SOAP se
služi aplikativnim HTTP protokolom koji koriste svi veb serveri.

Na slici 1 je uprošćen prikaz načina rada veb servisa:

Slika 1 Prikaz funkcionisanja veb servisa

1. Provajder servisa opisuje servis pomoć WSDL-a. Ovaj opis se objavljuje u direktorijumu
servisa. Direktorijum koristi Universal Description, Discovery, and Integration (UDDI).
2. Korisnik servisa postavlja jedan ili više query-ja ka direktorijumu servisa da bi se
pronašao servis i način komunikacije sa njim
3. Deo WSDL fajla, koji je provider servisa dostavio. Na ovaj način korisnik zna kako da
postavi zahtev i primi odgovor.
4. Korisnik servisa šalje zahtev
5. Provajder servisa šalje odgovor

Neki od primera primene veb servisa:

 Provera identiteta korisnika


 Upravljanje finansijskim računima
 Čitanje vrednosti berzanskih akcija
 Provera ispravnosti kreditnih kartica
 Rezervacija avio karata, turističkih aranžmana itd
 Vremenska prognoza
 RSS reader
 Upravljanje real-time podacima

6
 Provera ispravnosti unetih podataka
 Slanje SMS poruka

Korišćenje veb servisa (konzumiranje, eng. consuming) u aplikacijama relativno je jednostavno:


u aplikaciji treba dodati veb referencu na željeni veb servis, upisati njegovu adresu i pozvati iz
aplikacije kao da se radi o bilo kojoj drugoj klasi koja se nalazi unutar vaše aplikacije, a ne
negde na Internetu. Naravno, aplikacija u trenutku korišćenja funkcionalnosti veb servisa mora
imati pristup Internetu.

2.3 Osnovni standardi SOAP veb servisa


Osnovni standardi veb servisa su:
o Simple Object Access Protocol (SOAP)
o Web Service Description Language (WSDL)
o Universal Description, Discovery, and Integration (UDDI)

2.3.1 SOAP
SOAP je jednostavan protokol za razmenu informacija između aplikacija, zasnovan na XML-u.
Koristi se za komunikaciju (razmenu poruka) sa veb servisima.SOAP sadrži univerzalnu i
standardnu notaciju, što znači da aplikacije mogu da “komuniciraju“ bez obzira na hardverske i
softverske platforme. Na slici su prikazani osnovni elementi SOAP poruke

Slika 2 Elementi SOAP poruke

Koreni element svakog SOAP dokumenta je Envelope. Ovaj element sadrži opcioni element
Header i obavezni element Body. Header sadrži korisnički definisane blokove koji su namenjeni
za informacije specifične za aplikaciju (npr. autentifikacija korisnika). Blokovi mogu da sadrže
atribut mustUnderstand koji zahteva od primaoca poruke (veb servisa) da razume Header da bi
mogao da pristupi blokovima Body elementa. Body element sadrži konkretnu poruku

7
namenjenu primaocu. U primeru na sledećoj slici u zaglavlju SOAP poruke se nalaze korisničko
ime i lozinka klijenta koji šalje zahtev servisu. Sam zahtev je opisan u telu poruke i zahteva
pozivanje funkcije „PreuzmiCenovnik“ pri čemu joj šalje parametar „Datum“.

Slika 3 Primer SOAP poruke

2.3.2 WSDL
WSDL je XML dokument koji opisuje skup SOAP poruka i način kako se te poruke razmenjuju.
Notacija koju koristi WSDL fajl za opis formata poruka su XML šeme koje su pogodne za opis
interfejsa veb servisa kojima se može pristupiti sa različitih platformi i programskih jezika. WSDL
definiše gde je servis dostupan i koji komunikacioni protokol se koristi za komuniciranje sa
servisom. Sekcije WSDL dokumenta su:

Apstraktne definicije (Abstract Definitions):

 Types – ukoliko će se u razmeni podataka sa servisom koristiti nestandardni/složeni


tipovi podataka, potrebno je definisati ih ovde. Za definiciju tipova se obično koristi XSD
(XML Schema)

 Messages – sadrži opis poruka koje će se koristiti. Poruke mogu da imaju jedan ili više
delova (part) i za svakog od njih je definisano ime i tip. Tip može biti neki primitivan (npr.
xsd:string) ili neki od tipova koji su definisani u delu Types.

 PortTypes – sadrži opis funkcija, odnosno operacija – ime operacije, ulazne i izlazne
parametre. Za ulazne i izlazne parametre se uzimaju poruke definisane u prethodnom
delu (Messages)

Konkretne definicije (Concrete Descriptions):

8
 Bindings – definiše protokol koji će se koristiti za razmenu poruka za svaku operaciju
(funkciju). Za komunikaciju se najčešće koriste SOAP poruke.

 Services – sadrži opis veb sevisa, ime i njegovu adresu.

Slika 4 Elementi WSDL specifikacije

9
Slika 5 Funkcionalan pogled na WSDL

10
11
Slika 6 Primer WSDL dokumenta

2.3.3 UDDI
UDDI (Universal Description, Discovery and Integration) registri veb servisa su centralizovane
lokacije kojima se može pristupati na Internetu i koje korisnici mogu koristiti za pronalaženje veb
servisa koje nude druge kompanije i organizacije

Na slici je prikazan detaljan način funkcionisanja veb servisa

Slika 7 Detaljan prikaz komunikacije klijenta sa provajderom veb servisa

U levom gornjem delu slike je deo WSDL fajla koji se šalje ka direktorijumu. Vidi se da
CustomerInfoRequest metoda zahteva podatke o računu.(gde se vidi?) Istovremeno,
CustomerInfoResponse vraća niz podataka o vlasniku računa, kao što su: ime, telefon, adresa

12
2.4 Razvoj i upotreba SOAP veb servisa u PHP
Starije verzije PHP-a nisu omogućavale direktnu podršku za rad sa SOAP veb servisima, pa su
se koristile eksterne biblioteke, poput NuSOAP-a. Međutim, verzija 5 je omogućila direktnu
podršku za rad sa veb servisima, koja je potpuno objektno orijentisana, što svakako značajno
olakšava rad aplikacionom programeru.

Da bi se omogućila ova podrška, neophodno je aktivirati SOAP ekstenziju za PHP. To je


moguće učiniti odgovarajućom izmenom konfiguracionog php.ini fajla, ili kod WAMP servera
jednostavnim aktiviranjem opcije PHP -> PHP extensions -> php_soap (slika 8). Nakon
aktiviranja ove ekstenzije, moguće je koristiti odgovarajuće funkcije za SOAP veb servise.

Slika 8 Aktiviranje PHP SOAP ekstenzije

13
2.5 SOAP veb servis klijent
Korišćenje veb servisa može se protumačiti kao pozivanje predefinisanih metoda (funkcija), koje
vraćaju neku vrednost, određenog tipa. Praktično, može se povući analogija između veb servisa
i pojma crne kutije. Metode na veb servisu mogu se implementirati u bilo kom programskom
jeziku, koji ne zavisi od programskog jezika iz koga se one pozivaju. Zahvaljujući svojim
protokolima zasnovanim na XML-u, veb servisi su interoperabilni, što znači da se mogu pozivati
iz bilo kojeg programskog jezika koji podržava SOAP.

Da bi se mogao koristiti bilo koji veb servis, neophodno je kreirati klijenta koji može da šalje
zahtev i prima odgovor od servera.

2.5.1 Pozivanje metode veb servisa bez parametara


Najpre, treba definisati lokaciju WSDL fajla i kreirati instancu SoapClient klase za pristup veb
servisu:

$wsdl = "http://www.webservicex.net/geoipservice.asmx?wsdl";
$client = new SoapClient($wsdl);

Pri kreiranju nove instance klase SoapClient, mogu se koristiti dva konstruktora:
SoapClient($wsdl) ili SoapClient($wsdl, $options).

U prvom slučaju, koji je gore naveden, instanciraće se novi klijent veb servisa opisanog pomoću
wsdl jezika, na definisanoj adresi. Ostale opcije za podešavanje veb servisa uzimaju
podrazumevane vrednosti.

U drugom slučaju, osim lokacije wsdl fajla, definišu se i opcije bitne za kreiranje klijenta veb
servisa. Parametar $options predstavlja u stvari jedan asocijativni niz, sa definisanim
vrednostima. Na primer, na ovaj način je moguće podesiti proxy server (ukoliko je neophodan
za pristup veb servisu), kodni raspored karaktera, verziju SOAP protokola i slično. Na primer,
ukoliko želimo da koristimo proxy server, verziju SOAP-a 1.2 i da koristimo unicode (utf-8) kodni
raspored, klijenta instanciramo na sledeći način:

$wsdl = "http://www.webservicex.net/geoipservice.asmx?wsdl";
$options = array('proxy_host' => "proxy.fon.rs",'proxy_port' => 8080,
'soap_version' => SOAP_1_2, encoding => 'utf-8');
$client = new SoapClient($wsdl, $options);

U ovom primeru se poziva veb servis koji će prikazati naziv države iz koje je IP adresa sa koje
korisnik pristupa Internetu. U ovom slučaju, poziva se metoda GetGeoIPContext(), koja nema
ulaznih parametara. Dakle, to se može uraditi na sledeći način:
$rezultat = $client->GetGeoIPContext();

Varijabla $result će biti jedan objekat odgovarajućeg tipa, koji se može prikazati pomoću
asocijativnog niza:

14
stdClass Object ( [GetGeoIPContextResult] => stdClass Object ( [ReturnCode]
=> 1 [IP] => 178.148.11.26 [ReturnCodeDetails] => Success [CountryName] =>
Serbia [CountryCode] => SRB ) )

u šta se lako može uveriti pomoću naredbe:

print_r ($rezultat);
Dakle, tip povratnog objekta će biti u ovom slučaju GetGeoIPContextResult. Naziv tipa objekta
se uvek formira nadovezivanjem reči Result na izvorni naziv pozvane udaljene metode. Što se
tiče atributa koji su sadržani u navedenom objektu, oni zavise od same metode veb servisa. U
ovom slučaju, objekat GetGeoIPContextResult sadrži atribute ReturnCode, IP,
ReturnCodeDetails, CountryName, CountryCode.

Ukoliko je u kodu potrebno iskoristiti neki od njih, to je moguće uraditi na jednostavan način. Na
primer, za ispis države iz koje potiče IP adresa korisnika, koristi se sledeći kod:

echo ($rezultat -> GetGeoIPContextResult -> CountryName);

Komunikacija klijenta i servera

Sledeći deo teksta predstavlja komunikaciju i razmenu SOAP poruka između klijenta i servera.
Komunikacija započinje kada klijentski kod zatraži wsdl fajl koristeći HTTP zahtev. Ovo se
dešava pri konstruisanju SoapClient objekta.
GET /geoipservice.asmx?wsdl HTTP/1.1
Host: www.webservicex.net
Connection: close

Server odgovara šaljući HTTP odgovor koji u sebi nosi traženi WSDL fajl. On sadrži definicije
svih metoda raspoloživih u okviru GeoIPService veb servisa (zbog dužine fajla dat je skraćeni
prikaz sa dodatim komentarima):
<?xml version="1.0" encoding="utf-8"?>
<!-- Koreni element WSDL fajla -->
<wsdl:definitions ...>

<!-- Definicija korišćenih tipova -->


<wsdl:types>...</wsdl:types>

<!-- Definicije ulaznih/izlaznih parametara funkcija -->


<wsdl:message name="GetGeoIPSoapIn">
<wsdl:part name="parameters" element="tns:GetGeoIP" />
</wsdl:message>
<wsdl:message name="GetGeoIPSoapOut">
<wsdl:part name="parameters" element="tns:GetGeoIPResponse" />
</wsdl:message>

<!-- Definicija funkcije koju smo zvali u kodu -->


<wsdl:portType name="GeoIPServiceSoap">
<wsdl:operation name="GetGeoIPContext">
<wsdl:documentation>...</wsdl:documentation>
<wsdl:input message="tns:GetGeoIPContextSoapIn" />
<wsdl:output message="tns:GetGeoIPContextSoapOut" />
</wsdl:operation>

15
</wsdl:portType>

<!-- Deo koji određuje protokol, konkretno da će se za metodu


GetGeoIPContext koristiti SOAP poruke -->
<wsdl:binding name="GeoIPServiceSoap12" type="tns:GeoIPServiceSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetGeoIPContext">
<soap12:operation
soapAction="http://www.webservicex.net/GetGeoIPContext" style="document" />
<wsdl:input><soap12:body use="literal" /></wsdl:input>
<wsdl:output><soap12:body use="literal" /></wsdl:output>
</wsdl:operation>
</wsdl:binding>

<!-- Opis servisa i njegova adesa -->


<wsdl:service name="GeoIPService">
<wsdl:port name="GeoIPServiceSoap12" binding="tns:GeoIPServiceSoap12">
<soap12:address location=
"http://www.webservicex.net/geoipservice.asmx"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Nakon toga, klijent poziva željenu funkciju nad SoapClient objektom, u našem slučaju
GetGeoIPContext. SoapClient objekat šalje HTTP zahtev koji u sebi sadrži SOAP poruku koja
zahteva izvršenje GetGeoIPContext funkcije:

<?xml version="1.0" encoding="UTF-8"?>


<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="http://www.webservicex.net/">
<env:Body>
<ns1:GetGeoIPContext/>
</env:Body>
</env:Envelope>

Konačno, veb servis šalje HTTP odgovor koji sadrži SOAP poruku sa rezultatom izvršenja
tražene funkcije:

<?xml version="1.0" encoding="utf-8"?>


<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetGeoIPContextResponse xmlns="http://www.webservicex.net/">
<GetGeoIPContextResult>
<ReturnCode>1</ReturnCode>
<IP>212.69.5.83</IP>
<ReturnCodeDetails>Success</ReturnCodeDetails>
<CountryName>Serbia</CountryName>
<CountryCode>SRB</CountryCode>
</GetGeoIPContextResult>
</GetGeoIPContextResponse>
</soap:Body>
</soap:Envelope>

16
2.5.2 Prikaz HTTP zahteva i odgovora u HTML-u

Kao što smo videli, pozivanjem servisa pomoću SoapClient objekta, serveru se šalje HTTP
zahtev sa odgovarajućom SOAP porukom:
$rezultat = $client->GetGeoIPContext();

Pozvana funkcija, GetGeoIPContext vraća rezultat pomoću HTTP odgovora koji nosi SOAP
poruku sa rezultatom izvršenja funkcije.

Moguće je korišćenjem SoapClient objekta prikazati ove dve SOAP poruke. Da bismo to učinili,
potrebno je da u opcije pri konstrukciji SoapClient objekta dodamo opciju trace i dodelimo joj
vrednost 1:

$option=array('trace'=>1,'soap_version' => SOAP_1_2);


$client = new SoapClient($wsdl,$option);

Sada možemo da upotrebimo funkcije za ispisivanje poslate/primljene SOAP poruke:

echo $client->__getLastRequest();
echo $client->__getLastResponse();

Ovde se javlja problem - budući da su SOAP poruke zapravo XML kod, pojaviće se u sorsu
stranice ali neće biti prikazane na njoj. Jedno rešenje je da se oko njih postavi <xmp> HTML
tag. Sve što se nađe unutar ovog taga će biti prikazano takvo kakvo je, bez obrade. Ovaj tag
može da se koristi i za prikaz HTML tagova, npr. ako želimo da na stranici napišemo <br /> a da
to ne postane novi red u HTML-u.

echo "<xmp>";
echo $client->__getLastRequest();
echo $client->__getLastResponse();
echo "</xmp>";

2.5.3 Pozivanje metode veb servisa sa parametrima


Ukoliko metoda veb servisa zahteva ulazne parametre, kod će se neznatno razlikovati. Na
primer, korišćeni veb servis poseduje još jednu metodu GetGeoIP($IPAddress). Ova metoda
ima jedan ulazni parametar, $IPAddress, i ona prikazuje zemlju porekla unete IP adrese.

Instanciranje klijenta veb servisa vrši se na potpuno isti način:


$wsdl = "http://www.webservicex.net/geoipservice.asmx?wsdl";
$client = new SoapClient($wsdl);

Međutim, ulazni parametri metode prosleđuju se kao asocijativni niz, gde je ključ naziv ulaznog
parametra koji je definisan WSDL specifikacijom. Na primer, ako želimo da saznamo odakle je
računar kome pripada IP adresa 8.8.8.8 (Google-ov DNS server), metodu pozivamo na sledeći
način:
$rezultat = $client->GetGeoIP(array ('IPAddress' => '8.8.8.8'));

17
Što se tiče prikaza rezultata, važe iste napomene kao i kod prethodnog primera.

18
2.5.4 Primeri – SOAP veb servis klijenti
Primer 1 – Konverzija mera
<?php
$wsdl = "http://www.webservicex.net/convertMetricWeight.asmx?wsdl";
//$options = array('proxy_host' => "proxy.fon.rs",'proxy_port' => 8080,
'soap_version' => SOAP_1_2, encoding => 'utf-8');
$client = new SoapClient($wsdl);
//$client = new SoapClient($wsdl,$options);
$rezultat = $client->ChangeMetricWeightUnit(array('MetricWeightValue'=>'1',
'fromMetricWeightUnit'=>'kilogram','toMetricWeightUnit'=>'gram'));
//print_r ($rezultat);
echo ($rezultat -> ChangeMetricWeightUnitResult);
?>

Primer 2 – Periodni sistem elemenata


<?php
$wsdl = "http://www.webservicex.net/periodictable.asmx?WSDL";
//$options = array('proxy_host' => "proxy.fon.rs",'proxy_port' => 8080,
'soap_version' => SOAP_1_2, encoding => 'utf-8');
$client = new SoapClient($wsdl);
//$client = new SoapClient($wsdl,$options);
$rezultat = $client->GetAtomicNumber(array('ElementName'=>'Oxygen'));
//print_r ($rezultat);
echo ($rezultat -> GetAtomicNumberResult);
?>

Primer 3 – Vrednost akcija


<?php
if (isset($_POST['submit'])){
$wsdl = "http://www.webservicex.net/stockquote.asmx?WSDL";
//$options = array('proxy_host' => "proxy.fon.rs",'proxy_port' => 8080,
'soap_version' => SOAP_1_2, encoding => 'utf-8');
$client = new SoapClient($wsdl);
//$client = new SoapClient($wsdl,$options);
//MSFT je simbol kompanije Microsoft
$rezultat = $client->GetQuote(array('symbol'=> $_POST['symbol']));
//print_r ($rezultat);
echo ($rezultat -> GetQuoteResult);
}
?>
<form method = "POST" action = "primer5.php">
Stock symbol: <input type="text" name="symbol" />
<input type ="submit" value ="submit" name = "submit" />
</form><br/>
MSFT - Microsoft<br/>
GOOG – Google

Primer 4 – Konvertor valuta


<?php
if (isset($_POST['submit'])){
$wsdl = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL";
//$options = array('proxy_host' => "proxy.fon.rs",'proxy_port' => 8080,
'soap_version' => SOAP_1_2, encoding => 'utf-8');

19
$client = new SoapClient($wsdl);
//$client = new SoapClient($wsdl,$options);
$rezultat = $client->ConversionRate(array('FromCurrency'=>$_POST['from'],
'ToCurrency'=>$_POST['to']));
//print_r ($rezultat);
echo ($rezultat -> ConversionRateResult);
}
?>
<form method = "POST" action = "primer6.php">
From Currency: <input type="text" name="from" /><br/>
To Currency: <input type="text" name="to" /><br/>
<input type ="submit" value ="submit" name = "submit" />
</form><br/>

Primer 5 – google.php (knjige)


<!-- ++Begin Book Bar Wizard Generated Code++ -->
<!--
// Created with a Google AJAX Search Wizard
// http://code.google.com/apis/ajaxsearch/wizards.html
-->

<!--
// The Following div element will end up holding the actual bookbar.
// You can place this anywhere on your page.
-->
<div id="bookBar-bar">
<span style="color:#676767;font-
size:11px;margin:10px;padding:4px;">Loading...</span>
</div>

<!-- Ajax Search Api and Stylesheet


// Note: If you are already using the AJAX Search API, then do not include
it
// or its stylesheet again
//
// The Key Embedded in the following script tag is designed to work with
// the following site:
// http://localhost
-->
<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&source=uds-
bbw&key=ABQIAAAA6No2dFFeAruK-
xNykpUQPxT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTnrdNS5IWddqv-BEdkAeoKfLP8Qw"
type="text/javascript"></script>
<style type="text/css">
@import url("http://www.google.com/uds/css/gsearch.css");
</style>

<!-- Video Bar Code and Stylesheet -->


<script type="text/javascript">
window._uds_bbw_donotrepair = true;
</script>
<script
src="http://www.google.com/uds/solutions/bookbar/gsbookbar.js?mode=new"
type="text/javascript"></script>
<style type="text/css">
@import url("http://www.google.com/uds/solutions/bookbar/gsbookbar.css");

20
</style>

<script type="text/javascript">
function LoadBookBar() {

var bookBar;
var options = {
largeResultSet : !true,
horizontal : true,
autoExecuteList : {
cycleTime : GSbookBar.CYCLE_TIME_MEDIUM,
cycleMode : GSbookBar.CYCLE_MODE_RANDOM,
executeList : ["php"]
}
}

bookBar = new GSbookBar(document.getElementById("bookBar-bar"),


options);
}
// arrange for this function to be called during body.onload
// event processing
GSearch.setOnLoadCallback(LoadBookBar);
</script>
<!-- ++End Book Bar Wizard Generated Code++ -->

Primer 6 – google2.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Hello World - Google AJAX Search API Sample</title>
<link href="http://www.google.com/uds/css/gsearch.css"
type="text/css" rel="stylesheet"/>
<script
src="http://www.google.com/uds/api?file=uds.js&amp;v=1.0&source=uds-
bbw&key=ABQIAAAA6No2dFFeAruK-
xNykpUQPxT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTnrdNS5IWddqv-BEdkAeoKfLP8Qw"
type="text/javascript"></script>
<script language="Javascript" type="text/javascript">
//<![CDATA[
function OnLoad() {
// Create a search control
var searchControl = new GSearchControl();
// Add in a full set of searchers
var localSearch = new GlocalSearch();
searchControl.addSearcher(localSearch);
searchControl.addSearcher(new GwebSearch());
searchControl.addSearcher(new GvideoSearch());
searchControl.addSearcher(new GblogSearch());
searchControl.addSearcher(new GnewsSearch());
searchControl.addSearcher(new GimageSearch());
searchControl.addSearcher(new GbookSearch());
// Set the Local Search center point
localSearch.setCenterPoint("New York, NY");
// tell the searcher to draw itself and tell it where to attach

21
searchControl.draw(document.getElementById("searchcontrol"));
// execute an inital search
searchControl.execute("Fon");
}
GSearch.setOnLoadCallback(OnLoad);
//]]>
</script>
</head>
<body>
<div id="searchcontrol">Loading</div>
</body>
</html>

22
2.6 Kreiranje sopstvenog SOAP veb servisa
Programski jezik PHP omogućava relativno jednostavno kreiranje web servisa zasnovanih na
SOAP protokolu pomoću SOAP ekstenzije. Da bi se kreirao sopstveni web servis, koristi se
ugrađena klasa SoapServer. Konstruktor koji se koristi za instanciranje ove klase izgleda ovako:
$server = new SoapServer("wsdl_fajl.wsdl");

Dakle, jedini parametar koji se prosleđuje konstruktoru jeste putanja do WSDL fajla, kojim je
opisan web servis. Glavni nedostatak ove ekstenzije jeste nemogućnost automatskog
generisanja wsdl fajla. Dakle, aplikacioni programer bi u ovom slučaju morao da ručno kreira
WSDL fajl. Nakon instanciranja SoapServer-a, potrebno je dodati metode koje će se koristiti u
okviru servisa. Naravno, metode moraju prethodno biti opisane u wsdl fajlu i implementirane u
php-u. Kod za dodavanje metode na servis je sledeći:
$server->addFunction("naziv_metode");

Konačno, da bi servis „proradio“, neophodno je aktivirati ga. To je moguće uraditi pomoću


metode handle():
$server->handle();

U primeru 1 prikazano je kreiranje web servisa pomoću ugrađene metode. Ovaj servis ne radi
ništa posebno, prima parametar poštanskog broja grada i vraća slučajnu vrednost temperature
u datom gradu.

2.6.1 Primeri – SOAP veb servisi


PRIMER 1: Temperatura
primer1_server.php

<?php
function dajTemperaturu($postbroj) {
$temp = rand(-20,45);
return $temp;
}
$server = new SoapServer("temperatura.wsdl");
$server->addFunction("dajTemperaturu");
$server->handle();
?>

temperatura.wsdl

<?xml version ='1.0' encoding ='UTF-8' ?>


<definitions name='Temperatura'
targetNamespace='http://primer.org/temperatura'
xmlns:tns=' http://primer.org/temperatura '
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>

23
<!-- Odeljak types nije prisutan, ne definišu se slozeni tipovi -->

<!-- Definicija ulazno/izlaznih parametara -->


<message name='dajTemperaturuUlaz'>
<part name='postanskiBroj' type='xsd:string'/>
</message>
<message name='dajTemperaturuIzlaz'>
<part name='temperatura' type='xsd:float'/>
</message>

<!-- Definicija operacije (funkcije), koristi gore definisane


parametre-->
<portType name='TempPortType'>
<operation name='dajTemperaturu'>
<input message='tns:dajTemperaturuUlaz'/>
<output message='tns:dajTemperaturuIzlaz'/>
</operation>
</portType>

<!-- Definicija stila/protokola komunikacije (rpc/http) -->


<binding name='TempBinding' type='tns:TempPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='dajTemperaturu'>
<soap:operation
soapAction='urn:localhosttemperature#dajTemperaturu'/>
<input>
<soap:body use='encoded' namespace='urn:localhost-temperature'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:localhost-temperature'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>

<service name='TemperatureService'>
<port name='TempPort' binding='TempBinding'>
<!-- Definicija adrese servisa (izmeniti po potrebi) -->
<soap:address location='http://localhost/servisi-
primeri/primer1_server.php'/>
</port>
</service>
</definitions>

primer1_klijent.php

<?php
// Ako je submitovan postanski broj
if (isset($_GET['postbroj'])){

24
$pbroj = $_GET['postbroj'];
// kreira se SoapClient objekat, poziva servis i stampa rezultat
$klijent = new SoapClient("temperatura.wsdl");
$return = $klijent->dajTemperaturu($pbroj);
echo("Temperatura je: " . $return);
}
?>
<!-- forma za unos postanskog broja, submituje podatke ovoj istoj
stranici -->
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

Dakle, kao što je prikazano u primeru 1, glavni nedostatak korišćenja ugrađene ekstenzije je
nemogućnost automatskog generisanja WSDL fajla. Ovaj problem se može prevazići na više
načina. Na primer, moguće je korišćenje:

 WSO2 Web Service Framework-a za PHP (http://wso2.com/products/web-services-


framework/php/)
 WSHelper biblioteke (http://www.jool.nl/jool-tech-zone/webservice-helper/)
 Online WSDL generatora (http://www.nbsoftware.com/wizards/ws_gen.php)
 WSDL document biblioteke (http://code.google.com/p/wsdldocument/)
 NuSOAP biblioteke (http://sourceforge.net/projects/nusoap/) i dr.

Zbog jednostavnosti korišćenja i dobre kompatibilnosti sa najnovijom verzijom PHP-a, u daljim


primerima biće korišćena NuSOAP biblioteka. Da bi se ona koristila, neophodno je folder lib
prekopirati u folder projekta web servisa, a zatim u okviru fajla gde se kreira servis izvršiti
include biblioteke "lib/nusoap.php". U sledećem primeru, biće demonstrirana implementacija
istog servisa kao u primeru 1, ali pomoću NuSOAP biblioteke.

PRIMER 2: Temperatura pomoću NuSOAP-a


NuSOAP biblioteka sadrži klasu soap_server koja omogućava kreiranje web servisa, ali takođe i
klasu nusoap_client koja je ekvivalent klasi SoapClient iz php_soap ekstenzije, odnosno
predstavlja klijenta pomoću kog se može koristiti neki servis. U ovom primeru ćemo koristiti
običnu SoapClient klasu sa klijentske strane, a novu NuSOAP biblioteku sa serverske strane,
kako ne bismo morali sami da definišemo WSDL fajl.

Usled određenih nekompatibilnosti NuSOAP biblioteke sa novijim verzijama PHP-a, koje


dovode do ispisivanja grešaka i onemogućavaju izvršenje skripte, potrebno je primeniti jedno od
dva navedena rešenja:

1. Ugasiti prikazivanje grešaka za sve


skripte - za ovo je potrebno otvoriti
php.ini fajl i negde u njemu dodati:
display_errors = Off

Zatim je potrebno kliknuti na Restart All


Services kako bi izmenjena
podešavanja bila primenjena.

25
2. Ugasiti prikaz grešaka samo za tekuću skritpu dodavanjem:
ini_set('display_errors', 0);

primer2_server.php

<?php
// gasi prijavljivanje gresaka tokom izvrsenja ove skripte
ini_set('display_errors', 0);
// ukljucuje nusoap biblioteku
require_once('lib/nusoap.php');
// Konstruise server
$server = new soap_server();
$server->configureWSDL('mojServis');
// Registruje funkciju koja ce biti dostupna klijentima
$server->register(
'dajTemperaturu',
array('postbroj' => 'xsd:string'),
array('rezultat' => 'xsd:float')
);

function dajTemperaturu($postbroj) {
$temp = rand(-20,45);
return $temp;
}

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA


: '';
$server->service($HTTP_RAW_POST_DATA);
?>

primer2_klijent.php

<?php
if (isset($_GET['postbroj'])){
$pbroj = $_GET['postbroj'];
$klijent = new SoapClient("http://localhost/servisi-
primeri/primer2/primer2_server.php?wsdl");
$return = $klijent->dajTemperaturu($pbroj);
echo("Temperatura je: " . $return);
}
?>
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

26
PRIMER 2a - NuSOAP klijent
U ovom primeru ćemo pokazati korišćenje NuSOAP klase nusoap_client na klijentskoj strani u
kombinaciji sa već korišćenim serverom iz prethodnog primera.

primer2a_klijent.php

<?php
if (isset($_GET['postbroj'])){
$pbroj = $_GET['postbroj'];

ini_set('display_errors', 0);
require_once('lib/nusoap.php');

// kreira se nusoap_client objekat


$client = new nusoap_client('http://localhost/servisi-
primeri/primer2/primer2_server.php?wsdl',true);

// parametri koji će biti prosleđeni servisu


$parametri = array('postbroj' => $pbroj);

// poziva f-ju dajTemperaturu i šalje joj pripremljene parametre


$rezultat = $client->call('dajTemperaturu', $parametri);
echo $rezultat;
}
?>
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

Proxy objekat
Kada smo koristili php_soap ekstenziju, da bi pozvali servis koristili smo SoapClient i pozivali
smo funkciju servisa kao da imamo neku najobičniju PHP klasu i da zovemo njenu funkciju:
$klijent->dajTemperaturu($pbroj);

Kod NuSOAP klase nusoap_client, pozivanje funkcije servisa izgleda malo drugačije:
$client->call('dajTemperaturu', $parametri);

Ovaj način rada sa servisom nije toliko intuitivan kao prvi način; da bi isto postigli i u NuSOAP-u,
možemo da upotrebimo tzv. proxy objekat:
$proksi = $client->getProxy();
$rezultat = $proksi->dajTemperaturu($pbroj);

Kompletan primer bi onda izgledao ovako:

primer2b_klijent.php

<?php
if (isset($_GET['postbroj'])){
$pbroj = $_GET['postbroj'];

27
ini_set('display_errors', 0);
require_once('lib/nusoap.php');
$client = new nusoap_client('http://localhost/servisi-
primeri/primer2/primer2_server.php?wsdl',true);

// koristi se proxy objekat


$proksi = $client->getProxy();
$rezultat = $proksi->dajTemperaturu($pbroj);
echo $rezultat;
}
?>
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

2.7 Štampanje HTTP zahteva/odgovora


Možemo da odštampamo kompletno zaglavlje/sadržaj HTTP zahteva i odgovora koji se
razmenjuju sa servisom i nose SOAP poruke. Njih dobijamo od nusoap_client objekta na
sledeći način:
$client->request
$client->response

primer2c_klijent.php

<?php
if (isset($_GET['postbroj'])){
$pbroj = $_GET['postbroj'];

ini_set('display_errors', 0);
require_once('lib/nusoap.php');
$client = new nusoap_client('http://localhost/servisi-
primeri/primer2/primer2_server.php?wsdl',true);

$parametri = array('postbroj' => $pbroj);


$rezultat = $client->call('dajTemperaturu', $parametri);
echo $rezultat;

// Štampamo HTTP zahtev/odgovor sa SOAP porukama


echo '<h2>Zahtev</h2>';
echo '<xmp>' . $client->request . '</xmp>';
echo '<h2>Odgovor</h2>';
echo '<xmp>' . $client->response . '</xmp>';
}
?>
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

28
Greške
Možemo da koristimo getError metodu nusoap_client objekta kako bismo utvrdili da li je došlo
do greške i reagovali prema tome.

primer2d_klijent.php

<?php
if (isset($_GET['postbroj'])) {
$pbroj = $_GET['postbroj'];
ini_set('display_errors', 0);
require_once('lib/nusoap.php');
$client = new nusoap_client('http://localhost/servisi-
primeri/Primer2/primer2_server.php?wsdl',true);

// ako je doslo do greske pri konstrukciji


$err = $client->getError();
if ($err) {
echo '<p><b>Greska pri konstrukciji: ' . $err . '</b></p>';
exit();
}

$parametri = array('postbroj' => $pbroj);


$rezultat = $client->call('dajTemperaturu', $parametri);

// Provera da li je server javio gresku (SOAP fault)


if ($client->fault) {
echo '<p><b>Fault: ';
print_r($rezultat);
echo '</b></p>';
} else {
// Provera da li je doslo do greske
$err = $client->getError();
if ($err) {
echo '<p><b>Greska: ' . $err . '</b></p>';
} else {
print_r($rezultat);
echo '<h2>Zahtev</h2>';
echo '<xmp>' . $client->request . '</xmp>';
echo '<h2>Odgovor</h2>';
echo '<xmp>' . $client->response . '</xmp>';
}
}
}
?>
<form method="GET" action = "">
Poštanski broj: <input type="text" name="postbroj" id="postbroj" />
<input type="submit" value="posalji" name="submit" id="submit"/>
</form>

29
PRIMER 3: Sabiranje i oduzimanje
primer3_server.php

<?php
ini_set('display_errors', 0);
include "lib/nusoap.php";
$server = new soap_server();
$server -> configureWSDL('operacije', 'urn:operacije');
$server -> register(
'oduzmi',
array ('a' => 'xsd:int', 'b' => 'xsd:int'),
array ('return' => 'xsd:int'),
'urn:oduzmi'
);
$server -> register(
'saberi',
array ('a' => 'xsd:int', 'b' => 'xsd:int'),
array ('return' => 'xsd:int'),
'urn:saberi'
);
function oduzmi($a, $b) {
return $a-$b;
}
function saberi($a, $b) {
return $a+$b;
}
$HTTP_RAW_POST_DATA=isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server -> service($HTTP_RAW_POST_DATA);
?>

primer3_klijent.php

<?php
if (isset($_POST['dugme1'])){
$client = new SoapClient("http://localhost/servisi-
primeri/primer3/primer3_server.php?wsdl");
$return = $client->oduzmi($_POST['prvi'],$_POST['drugi']);
echo("Rezultat je: " . $return);
}
if (isset($_POST['dugme2'])){
$client = new SoapClient("http://localhost/servisi-
primeri/primer3/primer3_server.php?wsdl");
$return = $client->saberi($_POST['prvi'],$_POST['drugi']);
echo("Rezultat je: " . $return);
}
?>
<form name="form1" method="post" action="">
Broj a: <input type="text" name="prvi"> <br>
Broj b: <input type="text" name="drugi"> <br>
<input name="dugme1" type="submit" id="dugme1" value="oduzmi dva broja">
<input name="dugme2" type="submit" id="dugme2" value="saberi dva broja">
</form>

PRIMER 4: Rad sa bazom


U ovom primeru koristi se baza pod nazivom svet. Upiti pomoću kojih se kreira i popunjava
baza, dati su u nastavku:

30
CREATE DATABASE `baza` ;

Kreiranje tabele:
CREATE TABLE `drzava` (
`id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
`drzava` VARCHAR( 20 ) NOT NULL ,
`narod` VARCHAR( 15 ) NOT NULL ,
`glgrad` VARCHAR( 30 ) NOT NULL ,
`brstanovnika` VARCHAR( 20 ) NOT NULL ,
`kontinent` VARCHAR( 20 ) NOT NULL ,
`brglasova` INT( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
)
Ubacivanje podataka:
INSERT INTO `drzava` ( `id` , `drzava` , `narod` , `glgrad` , `brstanovnika`
, `kontinent` , `brglasova` )
VALUES (
'', 'Srbija', 'Srbi', 'Beograd', '7,5', 'Evropa', '5'
), (
'', 'Italija', 'italijani', 'Rim', '70', 'EU', '3'
);
INSERT INTO `drzava` ( `id` , `drzava` , `narod` , `glgrad` , `brstanovnika`
, `kontinent` , `brglasova` )
VALUES (
'', 'Spanija', 'Spanci', 'Madrid', '60', 'Evropa', '2'
), (
'', 'Svajcarska', 'Svajcarci', 'Bern', '7', 'Evropa', '3'
);

Baza sada izgleda ovako:

Slika 9 Izgled baze podataka

primer4_server.php

<?php
ini_set('display_errors', 0);
// Ubaciti nusoap.php, da bi se koristile odgovarajuce klase
require_once('lib/nusoap.php');

//soap_server metoda omogucava kreiranje SOAP servera, koji moze da prihvata


zahteve i salje odgovore
$server = new soap_server();
//configureWSDL(string $serviceName, string $namespace)
//kreira wsdl, koji omogucava interno kreiranje WSDL
$server->configureWSDL('primer1', 'urn:primer1');

31
// Registrovanje funkcije (SOAP operacija) (usluge) na serveru
$server->register('ispisi', // ime metode
array(), // ulazni parametar
array('return' => 'xsd:string'), // izlazni parametri
'urn:ispisi' // namespace
);

// Implementacija registrovanih metoda


function ispisi() {

$mysqli = new mysqli("localhost", "root", "", "baza");


if ($mysqli->connect_errno) {
printf("Konekcija neuspešna: %s\n", $mysqli->connect_error);
exit();
}
$mysqli->set_charset("utf8");

//citanje podataka o drzavi


$sql="SELECT * FROM drzava";
$result = $mysqli->query($sql);

//if ($result->num_rows!=0){
$pom=<<<EOD
<table border=1>
<tr>
<th>Drzava</th>
<th>Vecinski narod</th>
<th>Broj stanovnika</th>
<th>Glavni grad</th>
<th>Kontinent</th>
</tr>
EOD;

while($row = $result->fetch_object()) {
$pom= $pom. "<tr>";
$pom= $pom. "<tr>" . "<td>" . $row->drzava . "</td>";
$pom= $pom. "<td>" . $row->narod . "</td>";
$pom= $pom. "<td>" . $row->brstanovnika . "</td>";
$pom= $pom. "<td>" . $row->glgrad . "</td>";
$pom= $pom. "<td>" . $row->kontinent . "</td>";
$pom= $pom. "</tr>";
}

$pom= $pom."</table>";
/*}
else{
$pom="Nema nista iz baze";
}*/

return $pom;
}

//$HTTP_RAW_POST_DATA super globalna varijabla koja sadrzi XML SOAP zahtev,


odnosno sve sto je poslato preko HTTP. Proverava se da li je zahtev
postavljen.
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
//analizira XML zahtev, pozivanje odgovarajuce funkcije i slanje odgovora

32
$server->service($HTTP_RAW_POST_DATA);
?>

primer4_klijent.php

<?php
$client = new SoapClient("http://localhost/servisi-
primeri/Primer4/primer4_server.php?wsdl");
$return = $client->ispisi();
echo($return);
?>

PRIMER 5: Primer logovanja

U ovom primeru koristi se baza pod nazivom logovanje. Upiti pomoću kojih se kreira i
popunjava baza, dati su u nastavku:
CREATE DATABASE `logovanje` ;

Kreiranje tabele:
CREATE TABLE IF NOT EXISTS `korisnici` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` text NOT NULL,
`password` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Ubacivanje podataka:

INSERT INTO `korisnici` (`id`, `username`, `password`) VALUES


(1, 'proba', 'proba');

Baza sada izgleda ovako:

primer5_server.php

<?php
ini_set('display_errors', 0);

// Ubaciti nusoap.php, da bi se koristile odgovarajuce klase


require_once('lib/nusoap.php');

//soap_server metoda omogucava kreiranje SOAP servera, koji moze da prihvata


zahteve i salje odgovore

33
$server = new soap_server();
//configureWSDL(string $serviceName, string $namespace)
//kreira wsdl, koji omogucava interno kreiranje WSDL
$server->configureWSDL('primer1', 'urn:primer1');
// Registrovanje funkcije (SOAP operacija) (usluge) na serveru
$server->register('proveri',
array('username' => 'xsd:string','password' => 'xsd:string'),
array('return' => 'xsd:int'),
'urn:proveri'
);

// Implementacija registrovanih metoda


function proveri($username, $password) {
$mysqli = new mysqli("localhost", "root", "", "logovanje");
$mysqli->set_charset("utf8");

//citanje podataka o korisniku


$sql="SELECT * FROM korisnici WHERE username = '".$username."' AND password =
'".$password."'";
$result = $mysqli->query($sql);
$broj_redova = $result->num_rows;
if ($broj_redova == 1) return 1;
else return 0;
}

//$HTTP_RAW_POST_DATA super globalna varijabla koja sadrzi XML SOAP zahtev,


odnosno sve sto je poslato preko HTTP. Proverava se da li je zahtev
postavljen.
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
//analizira XML zahtev, pozivanje odgovarajuce funkcije i slanje odgovora
$server->service($HTTP_RAW_POST_DATA);
?>

primer5_klijent.php

<?php
session_start();

function prikaziFormu(){
echo '<form method="POST" action="">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" />
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" />
</tr>
<tr>
<td></td>
<td><input type="submit" name="submit" value="prijava" />
</tr>
</table>
</form>
';

34
}
function proveriKorisnika($username,$password){
$client = new
SoapClient("http://localhost/soap_server/primer5/primer5_server.php?wsdl");
$return = $client->proveri($username,$password);
return $return;
}

if (isset ($_POST['submit'])){
$vrednost = proveriKorisnika($_POST['username'], $_POST['password']);
if ($vrednost == 1) $_SESSION['ulogovan'] = 'da';
else echo "Neispravni podaci!";
}
?>
<html>
<head>
</head>
<body>
<?php
if (isset($_SESSION['ulogovan'])){
if ($_SESSION['ulogovan']=='da'){
echo "Uspesno ste prijavljeni!
<br/><a href='primer5_klijent.php'>Prva stranica</a>
<br/><a href='druga.php'>Druga stranica</a>
<br/><a href='odjava.php'>Odjava</a>
";
} else {
prikaziFormu();
}

} else {
prikaziFormu();
}
?>

druga.php

<?php
session_start();
if (isset ($_SESSION['ulogovan'])){
if ($_SESSION['ulogovan'] == 'da'){
echo "Skriveni sadrzaj!
<br/><a href='primer5_klijent.php'>Prva stranica</a>
<br/><a href='druga.php'>Druga stranica</a>
<br/><a href='odjava.php'>Odjava</a>";
} else {
header ("Location: primer5_klijent.php");
}
} else {
header ("Location: primer5_klijent.php");
}
?>

odjava.php

<?php

35
session_start();
if (isset ($_SESSION['ulogovan'])) unset ($_SESSION['ulogovan']);
header ("Location: primer5_klijent.php");
?>

36

You might also like