Professional Documents
Culture Documents
INTERNET TEHNOLOGIJE
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.
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.
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).
WSDL je zasnovan na XML i predstavlja opis interfejsa veb servisa koji treba da sadrži:
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.
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.
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
6
Provera ispravnosti unetih podataka
Slanje SMS poruka
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
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“.
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:
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)
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.
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
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.
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.
$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 ) )
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:
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 ...>
15
</wsdl:portType>
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:
Konačno, veb servis šalje HTTP odgovor koji sadrži SOAP poruku sa rezultatom izvršenja
tražene funkcije:
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:
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>";
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);
?>
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/>
<!--
// 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>
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"]
}
}
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&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");
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.
<?php
function dajTemperaturu($postbroj) {
$temp = rand(-20,45);
return $temp;
}
$server = new SoapServer("temperatura.wsdl");
$server->addFunction("dajTemperaturu");
$server->handle();
?>
temperatura.wsdl
23
<!-- Odeljak types nije prisutan, ne definišu se slozeni tipovi -->
<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:
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;
}
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');
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);
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);
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);
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);
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>
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'
);
primer4_server.php
<?php
ini_set('display_errors', 0);
// Ubaciti nusoap.php, da bi se koristile odgovarajuce klase
require_once('lib/nusoap.php');
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
);
//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;
}
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);
?>
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:
primer5_server.php
<?php
ini_set('display_errors', 0);
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'
);
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