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.
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 formatu (XML, JSON, običan tekst ili drugi). U ovoj skripti će biti
prikazana oba pristupa problematici veb servisa.
1Više informacija o teorijskim konceptima SOA i veb servisa se može pronaći u okviru prezentacije
sa predavanja SOA
3
2 REST veb servisi
Američki naučnik Roy Fielding je u svojoj doktorskoj disertaciji odbranjenoj 2000. godine prvi
definisao REST koncept. REST arhitekturni stil sadrži pet obaveznih i jedno opciono
ograničenje:
Ukoliko servis zadovoljava prvih pet ograničenja, takav servis predstavlja primer RESTful
servisa.
HTTP protokol olakšava komunikaciju između poslovnih aplikacija tako što prenosi jedan fajl
od jednog do drugog računara, odnosno dodaje jedan sloj apstrakcije između transportnog
sloja i aplikacionog sloja. Hypertext Transfer Protocol (HTTP) definiše niz standardnih
pravila za prezentaciju, signaliziranje, autentikaciju i otklanjanje grešaka, prilikom slanja
informacija preko interneta. HTTP predstavlja standard koji definiše zahteve i odgovore
između klijenta i servera. Klijent kreira HTTP zahtev koristeći veb browser, odnosno
korisnički agent (na primer, PHP ukoliko on kreira REST klijenta). Sa servera se kao
odgovor šalju skladišteni resursi.
Obično je resurs predstavljen u obliku fajla, ali isto tako resurs može biti dinamički generisan
rezultat upita, izlaz CGI skripta i sl. Resursi kojima se pristupa se identifikuju korišćenjem
Uniform Resource Identifiers (URIs), odnosno Uniform Resource Locators (URLs). Između
korisnikovog agenta i servera porekla se mogu nalaziti posrednici: proxy, gateway, tuneli...
HTTP nije ograničen samo na korišćenje TCP/IP i pripadajućih slojeva, već može biti
implemetiran na vrhu bilo kog drugog Internet protokola.
4
U opštem obliku, HTTP zahtev je prikazan na sledećem dijagramu:
Prva linija zahteva sadrži metodu, URL zahteva (putanja sa izostavljenim nazivom servera) i
verziju HTTP protokola. Sledećih nekoliko linija sadrži HTTP header u kom se nalaze bitne
informacije, kao što su naziv udaljenog servera, format u kome će biti HTTP odgovor,
encoding i sl. Konačno, nakon header dela (i još jedne prazne linije), definiše se body deo
koji je značajan za POST metodu, pošto se u ovom delu definišu POST promenljive.
Na primer, ukoliko se zahteva neka strana, bez potrebe za slanjem dodatnih parametara,
koristi se GET metoda:
GET / HTTP/1.1
Host: www.fon.rs
prazan_red
prazan_red_u_body_delu
HTTP/1.1 200 OK
Content-Length: 18193
Content-Type: text/html
Content-Location: http://www.fon.rs/index.html
Last-Modified: Tue, 18 Dec 2012 12:16:24 GMT
Accept-Ranges: bytes
ETag: "30ad5f7f19ddcd1:1eb0"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2012 15:42:06 GMT
5
</html>
Ukoliko se parametri šalju korišćenjem GET metode, zahtev neće biti bitno promenjen,
odnosno parametri se šalju u URL-u:
ime=Petar&prezime=Petrovic
Dakle, u telu zahteva se šalju POST parametri, u ovom slučaju parametri ime i prezime.
Prilikom slanja različitih tipova HTTP zahteva, kao i prilikom prijema HTTP odgovora, koriste
se header-i (zaglavlja). Oni u sebi sadrže korisne informacije o zahtevu, odnosno odgovoru.
Spisak svih header-a i objašnjenja dat je u HTTP specifikaciji, koja se nalazi na adresi
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html. Sledi prikaz najčešće korišćenih
zaglavlja:
6
a svaka heksadecimalna cifra može da se predstavi i ASCII karakterom (ASCII tabela sadrži
cifre i slova).
Na primer, HTTP zahtev u kome se zahteva binarni fajl ne razlikuje se od bilo kog drugog
HTTP zahteva:
GET http://www.elab.rs/simlab/images/stories/slike_pocetna/elab_logo.jpg
HTTP/1.1
Accept: image/jpg
Host: www.elab.rs
HTTP/1.1 200 OK
Date: Tue, 18 Dec 2012 17:10:22 GMT
Server: Apache
Last-Modified: Thu, 08 Sep 2011 09:49:17 GMT
ETag: "1e74-4ac6af95d6140"
Accept-Ranges: bytes
Content-Length: 7796
Content-Type: image/jpeg
►JFIF☺☺☺HH
°ICC_PROFILE☺☺
►desc☺DybXYZ☺└¶bTRC☺╘ Φ☻mntrRGB XYZ ┘♥§$▼acsp☺÷╓☺╙-)°=▐»≥U«xB·Σ╩â9
dmdd αêgXYZ
h¶gTRC☺╘
lumi
|¶meas
É$bkpt
┤¶rXYZ
╚¶rTRC☺╘
tech
v
ued
Φçwtpt
p¶cprt
...
U odgovoru je poslata JPEG slika u ASCII formatu, u skladu sa MIME tipom image/jpeg, koji
je poslat u zaglavlju HTTP odgovora.
7
2.2 Osnovni koncepti REST-a
Osnovni koncept REST-a je resurs. Resurs može biti bilo kakva informacija ili koncept,
dokument, slika, servis, kolekcija resursa, osoba itd. Resurs identifikuje identifikator resursa,
kao što je URI. Pomoću identifikatora se dobavlja reprezentacija resursa - koja predstavlja
resurs u nekom stanju u kojem se nalazi. Manipulisanje resursom se obavlja preko ove
reprezentacije tako što se nad njom vrše operacije. Rezultat vršenja operacije je ponovo
neka reprezentacija resursa koji će se naći u nekom novom stanju.
1. Svaka stvar (resurs) ima jedinstveni ID; u slučaju veb-a u pitanju je URI koji je uvek
globalno jedinstven (npr. ne mogu da postoje dva www.google.com). Primer:
http://primer.com/proizvodi/4554
http://primer.com/porudzbine/2007/11
http://primer.com/proizvodi?boja=zelena
2. Resursi treba da su povezani; ako se koristi HTTP i URI-ji, moguće je povezati jedan
resurs sa drugima bez obzira na njihovu lokaciju. Primer jednog resursa koji ima linkove
ka drugim resursima:
3. Koristi se standardni set metoda; u slučaju HTTP-a, to su GET, POST, PUT, DELETE i
HEAD. Svaki resurs podržava isti interfejs, isti skup metoda. Kada pretraživač učitava
neku veb stranicu, on koristi GET metodu i URI stranice koju traži:
Ako tražena stranica sadrži slike i druge eksterne sadržaje, pretraživač ponovo koristi GET
metodu, ovaj put sa identifikatorima tih slika/sadržaja kako bi ih dobavio. GET metoda je tzv.
“bezbedna” metoda, pri njenom korišćenju je garantovano da neće doći do promene resursa.
Moguće je napraviti servis (npr. PHP skriptu) kod koje će se GET koristiti i za stvari kao što
je brisanje/izmena resursa, ali to nije po principima REST-a i treba ga izbegavati:
4. Resursi mogu da imaju više reprezentacija; npr. jednu u HTML formatu namenjenu
pregledanju u pretraživačima i više njih u različitim XML formatima podataka.
8
2.4 Poređenje SOAP i REST pristupa
SOAP
SOAP je XML protokol izgrađen povrh HTTP-a ili nekog drugog protokola. Drugim
rečima, SOAP poruke se prenose pomoću HTTP zahteva i odgovora.
SOAP opisuje funkcije i tipove podataka
SOAP pristup obuhvata više tehnologija i standarda: WSDL, XSDs, SOAP, WS-
Addressing
Određeni broj programskih jezika ima podršku za SOAP pa se korišćenje ovakvih
servisa samo svodi na unos njegove adrese i dalje jednostavno pozivanje željenih
funkcija (primer: iznad dati PHP kodovi)
REST
Kao što je pokazano ranije, kod veb servisa zasnovanih na SOAP porukama, zahtev za
izvršenje neke funkcije bi izgledao ovako (kao deo nekog HTTP zahteva):
<?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:body pb="http://www.acme.com/phonebook">
<pb:GetUserDetails>
<pb:UserID>12345</pb:UserID>
</pb:GetUserDetails>
</soap:Body>
</soap:Envelope>
Odgovor bi kod SOAP-a ponovo bio u obliku SOAP poruke, dok kod REST-a može biti u bilo
kom formatu, najčešće u nekom specifičnom XML formatu ili u JSON-u.
Pri poređenju SOAP-a i REST-a se može povući analogija sa slanjem pisma - SOAP je
ekvivalentan slanju klasičnog pisma u koverti; REST je ekvivalentan slanju razglednice.
Razglednicama je lakše manipulisati, troše manje papira (u stvarnosti protoka) i obično imaju
kraći sadržaj.
9
2.5 Potrebne komponente za REST veb servise
XML i JSON
http://primer.com/klijent/1
Koristiće se XML format čitljiv programima. Kako će taj XML izgledati, u potpunosti zavisi od
projektanta servisa, odnosno ne postoji nikakav standard po tom pitanju. Primer:
<customer>
<custid>1</custid>
<fname>John</fname>
<lname>Smith</lname>
</customer>
Osim XML formata, za prikaz podataka kod REST servisa često se koristi i JSON. Prethodni
primer zapisan u formatu JSON objekta izgleda ovako:
{
"customer": {
"custid": 1,
"fname": "John",
"lname": "Smith"
}
}
I kod REST-a je moguće koristiti WSDL za opis formata poruka, ali to nije uobičajna praksa
kada se koristi REST zbog dodatne kompleksnosti koju obično težimo da izbegnemo.
HTTP metode
Iako GET može da se koristi za obavljanje svih operacija, npr. ako imamo skriptu koja
razume sledeće akcije:
http//fon.rs/index.php?akcija=citaj
http//fon.rs/index.php?akcija=obrisi
http//fon.rs/index.php?akcija=izmeni
10
Ovo treba izbegavati. Najbolje je razdvojiti posao tako da GET ostane “bezbedna” metoda
koja garantovano ne vrši nikakve izmene nad resursom, a za izmene koristiti POST metodu.
Može se takođe koristiti i kombinacija GET i POST metode, kod koje GET metoda služi za
definisanje akcije, a POST metoda za slanje podataka. Naravno, mogu da postoje i servisi
koji koriste samo GET metodu, primer za to su RSS feedovi koji nude samo mogućnost
čitanja najnovijih vesti.
URI
URI određuje lokaciju resursa, u ovom slučaju veb servisa. Potrebno je osmisliti
odgovarajuće opisno ime za servis i takođe projektovati razumljivu i fleksibilnu hijerarhiju. Na
primer, ako pravimo servis koji će davati informacije o automobilima, možemo da mu
napravimo hijerarhiju:
http://www.example.org/auto/Ford
http://www.example.org/auto/Chevy
http://www.example.org/auto/Nissan
Serverski deo REST servisa vraća neki dokument, kao što su podaci u XML ili JSON format,
slika u JPEG ili PNG formatu, PDF dokument i dr. REST servis (serverski deo) može da se
kreira u bilo kom jeziku serverske strane. Primeri u ovoj skripti su u PHP skriptnom jeziku.
Klijentski deo REST servisa poziva REST API (serverski deo REST servisa), obrađuje
podatke i prikazuje ih korisniku u pogodnom obliku. U ovoj skripti biće prikazano korišćenje
REST-a od strane PHP i JavaScript (JQuery AJAX) klijenata.
U PHP skriptnom jeziku, REST klijenta je moguće kreirati na više različitih načina. Ovde će
biti prikazano korišćenje funkcije file_get_contents() i CURL biblioteke.
Napravićemo jednostavan REST veb servis koji će primati dva broja kao parametre i vraćati
njihov zbir kao rezultat. Sam po sebi ovaj servis se ne razlikuje od običnih veb aplikacija
osim u jednoj stvari - pozivom funkcije header namešten je tip rezultata kao text/xml.
rest_server_1.php
<?php
// sabira prosledjena dva broja i sastavlja XML fajl sa rezultatom
11
function sabiranje($num1, $num2) {
$rezultat = '<rezultat >';
$rezultat .= $num1 + $num2;
$rezultat .= '</rezultat >';
return $rezultat;
}
Klijent koristi DOMDocument objekat koji predstavlja XML dokument da učita i prikaže
rezultat koji vraća naš servis. Pozivanje servisa se vrši njegovom funkcijom load koja kao
parametar uzima adresu XML dokumenta kojeg treba učitati, u ovom slučaju skripta koja
implementira servis se nalazi u www\probe\ folderu. Parametri se servisu šalju klasično, u
obliku URL query stringa (GET metoda).
rest_klijent_1.php
<?php
// lokacija servera i putanja do skripte (servisa) na tom serveru
$server = 'http://localhost';
$path = '/probe/rest_server_1.php';
U ovom primeru ćemo videti kako se iz PHP-a direktno šalje POST zahtev nekom REST veb
servisu. Kao što je navedeno ranije, POST treba koristiti za operacije koje vrše izmene nad
podacima. U ovom slučaju, kako bismo uprostili primer, koristićemo jednostavan servis koji
samo štampa odgovarajuću poruku zavisno od toga da li je kontaktiran korišćenjem POST-a
ili ne:
rest_server_2.php
<?php
header('Content-type: text/xml');
echo '<?xml version="1.0"?>';
if (isset($_POST['akcija']) {
12
echo "<poruka>Stigla akcija</poruka>";
} else {
echo "<poruka>Nije stigla akcija</poruka>";
}
?>
Kod za klijenta je nešto složeniji, koristićemo PHP streamove za slanje HTTP zahteva:
rest_klijent_2.php
<?php
$server = 'http://localhost';
$path = '/probe/restserver.php';
13
2.6.2 Korišćenje CURL biblioteke
CURL predstavlja biblioteku i komandni softverski alat koji omogućava prenos podataka
korišćenjem različitih protokola (FTP, FTPS, Gopher, HTTP, HTTPS, SCP, SFTP, TFTP,
Telnet, DICT, the file URI scheme, LDAP, LDAPS, IMAP, POP3, SMTP i RTSP). U pitanju je
softversko rešenje koje podržava više različitih platformi, uključujući Linux i Windows, a autor
CURL paketa je Daniel Stenberg. CURL alat takođe podržava i HTTPS sertifikate, HTTP
POST, HTTP PUT, FTP postavljanje fajlova, Kerberos, HTTP postavljanje fajlova preko
formi, proxy servere, kukije, autentifikaciju pomoću korisničkog imena i lozinke, nastavljanje
prenosa fajlova i HTTP proxy tunele.
Programski jezik PHP od svoje verzije 4.0.2 ima podršku za CURL. Ukoliko se koristi WAMP
server kao Apache-PHP-MySQL rešenje, potrebno je uključiti CURL ekstenziju. To je
moguće uraditi izborom opcije PHP -> PHP extensions -> php_curl, nakon klika na ikonicu
WAMP-a. Navedeni postupak je prikazan i na slici:
Ukratko, CURL ekstenzija se koristi za pozivanje REST servisa, odnosno za kreiranje REST
klijenta. Funkcije navedene ekstenzije programeru pružaju veću fleksibilnost u odnosu na
korišćenje drugih funkcija za kreiranje REST klijenta (kao što je na primer korišćenje struja,
prikazano u prethodnom poglavlju). CURL omogućava dosta jednostavan izbor željene
HTTP metode i prosleđivanje parametara.
$curl_zahtev = curl_init("http://www.fon.rs");
14
opcija), a treća vrednost predstavlja vrednost podešavanja. U narednoj tabeli prikazane su
najčešće korišćene opcije i moguće vrednosti tih opcija, a kompletan spisak opcija nalazi se
na adresi http://php.net/manual/en/function.curl-setopt.php :
$curl_odgovor = curl_exec($curl_zahtev);
Kasnije je potrebno parsirati odgovor, pošto je on najčešće u XML ili JSON formatu.
curl_close($curl_zahtev);
Sledi kompletan primer CURL zahteva. U pitanju je POST zahtev ka FON-ovoj stranici, gde
se šalju POST promenljive na server:
$curl_zahtev = curl_init("http://www.fon.rs");
curl_setopt($curl_zahtev, CURLOPT_POST, TRUE);
curl_setopt($curl_zahtev, CURLOPT_POSTFIELDS,
"ime=Petar&prezime=Petrovic");
$curl_odgovor = curl_exec($curl_zahtev);
curl_close($curl_zahtev);
U ovom slučaju se u varijabli $curl_odgovor čuva kompletan HTML kod stranice fon.rs, pošto
je ova stranica u HTML formatu. Naravno, od samog servisa zavisi u kom formatu će biti
podaci.
15
2.7 Primeri REST klijenata koji pozivaju gotove servise
Na Internetu je moguće pronaći veliki broj gotovih REST servisa, različitih funkcionalnosti.
Među njima se nalaze servisi za konverziju valuta, mernih jedinica, dobijanje informacija o
posetiocima sajta pomoću IP adrese, servisi za vremensku prognozu i sl. U ovom poglavlju
biće predstavljeno nekoliko javnih REST veb servisa. Jedan direktorijum javnih REST
servisa nalazi se na adresi: http://www.programmableweb.com/apis/directory/. Većina javnih
REST servisa zahteva registraciju koja je u velikom broju slučajeva besplatna. Nakon
registracije, obično se dobija API ključ, pomoću koga je moguće slati HTTP zahteve.
Za testiranje velikog broja različitih veb servisa, moguće je koristiti servis ApiGee, na adresi
https://apigee.com/console/. Ovde je moguće izabrati neki javni veb servis sa liste i proslediti
mu parametre, nakon čega se dobija odgovor servisa u nekom formatu (XML ili JSON).
Slika 3 ApiGee
Rate Exchange je jednostavan besplatan REST api koji vrši konverziju valuta. Zahtev ka
ovom API-ju se šalje kao HTTP GET zahtev. End point se nalazi na adresi http://rate-
exchange.appspot.com/currency. Parametri su sledeći:
Parametar Vrednost
from izvorna valuta
to valuta u koju se izvorna valuta konvertuje (ISO 4217 troslovni
kod)
q količina izvorne valute koja se konvertuje (ISO 4217 troslovni kod)
16
Za upotrebu ovog API-a nije potrebna registracija. Sledi primer zahteva za konverziju 10
evra u dinare:
http://rate-exchange.appspot.com/currency?from=EUR&to=RSD&q=10
U nastavku sledi prikaz klijenta, koji zahteva unos željene valute. Klijent prikazuje kurs unete
valute u odnosu na dinar:
klijent.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<h2>Jednostavan servis</h2>
<form method="GET" action="">
Iznos: <input type = "text" name = "iznos"/><br/>
Iz valute: <input type = "text" name = "izvalute"/><br/>
U valutu: <input type = "text" name = "uvalutu"/><br/>
<input type = "submit" value="konvertuj"/>
</form>
<?php if (!empty ($_GET['iznos'])&&!empty ($_GET['izvalute'])&&!empty
($_GET['uvalutu'])){?>
<?php
$iznos = $_GET['iznos'];
$izvalute = $_GET['izvalute'];
$uvalutu = $_GET['uvalutu'];
$url = 'http://rate-
exchange.appspot.com/currency?from='.$izvalute.'&to='.$uvalutu.'&q='.$iznos
;
$curl = curl_init($url);
//za FON-ovu mrezu treba podesiti proksi. Za ostale mreze linije za proksi
treba da budu pod komentarom
curl_setopt($curl, CURLOPT_PROXY, 'proxy.fon.rs:8080');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, false);
$curl_odgovor = curl_exec($curl);
curl_close($curl);
$parsiran_json = json_decode ($curl_odgovor);
if (property_exists($parsiran_json, 'v')){
?>
<h2>Rezultat:</h2>
<p><?php echo $iznos;?> <?php echo $izvalute;?> vredi <?php echo
$parsiran_json->v;?> <?php echo $uvalutu;?>.</p>
<h2>Kompletan JSON:</h2>
<p><?php echo $curl_odgovor;?></p>
<?php
} else {
?>
<h2>Rezultat:</h2>
<p>Nisu validni ulazni parametri.</p>
<h2>Kompletan JSON:</h2>
<p><?php echo $curl_odgovor;?></p>
17
<?php
}
}
?>
</body>
</html>
http://api.worldweatheronline.com/free/v1/weather.ashx?q=Belgrade,Serbia&fo
rmat=json&num_of_days=2&key=API_KLJUČ
{
"data":{
"current_condition":[
{
"cloudcover":"0",
"humidity":"70",
"observation_time":"02:36 PM",
"precipMM":"0.0",
"pressure":"1034",
"temp_C":"4",
"temp_F":"39",
"visibility":"5",
"weatherCode":"116",
"weatherDesc":[
{
"value":"Partly Cloudy"
}
],
"weatherIconUrl":[
{
"value":"http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/ws
ymbol_0002_sunny_intervals.png"
18
}
],
"winddir16Point":"SE",
"winddirDegree":"124",
"windspeedKmph":"0",
"windspeedMiles":"0"
}
],
"request":[
{
"query":"Belgrade, Serbia",
"type":"City"
}
],
"weather":[
{
"date":"2013-12-03",
"precipMM":"0.0",
"tempMaxC":"4",
"tempMaxF":"39",
"tempMinC":"-3",
"tempMinF":"26",
"weatherCode":"116",
"weatherDesc":[
{
"value":"Partly Cloudy"
}
],
"weatherIconUrl":[
{
"value":"http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/ws
ymbol_0002_sunny_intervals.png"
}
],
"winddir16Point":"SE",
"winddirDegree":"124",
"winddirection":"SE",
"windspeedKmph":"10",
"windspeedMiles":"6"
},
{
"date":"2013-12-04",
"precipMM":"0.0",
"tempMaxC":"4",
"tempMaxF":"38",
"tempMinC":"-2",
"tempMinF":"29",
"weatherCode":"113",
"weatherDesc":[
{
"value":"Sunny"
}
],
"weatherIconUrl":[
{
"value":"http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/ws
ymbol_0001_sunny.png"
}
],
19
"winddir16Point":"SE",
"winddirDegree":"128",
"winddirection":"SE",
"windspeedKmph":"9",
"windspeedMiles":"6"
}
]
}
}
klijent.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<?php
//Zameniti URL putanjom serverskog dela REST servisa i zameniti vrednost
API ključa
$url='
http://api.worldweatheronline.com/free/v1/weather.ashx?q=Belgrade,Serbia&fo
rmat=json&num_of_days=2&key=API_KLJUČ';
$curl = curl_init($url);
//za FON-ovu mrezu treba podesiti proksi. Za ostale mreze linije za proksi
treba da budu pod komentarom
curl_setopt($curl, CURLOPT_PROXY, 'proxy.fon.rs:8080');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, false);
$curl_odgovor = curl_exec($curl);
curl_close($curl);
$parsiran_json = json_decode ($curl_odgovor);
$temperatura = $parsiran_json->data->current_condition[0]->temp_C;
?>
<h2>Rezultat:</h2>
<p>Trenutna temperatura u Beogradu je <?php echo $temperatura;?> *C.</p>
<h2>Kompletan JSON:</h2>
<p><?php echo $curl_odgovor;?></p>
</body>
</html>
20
2.7.3 Primer 3 – Geolokacija http://www.hostip.info/use.html
Veb servis opisan u ovom primeru služi da na osnovu unete IP adrese vrati državu (često i
grad) iz koje navedena IP adresa potiče.
Ovaj servis se može koristiti na više načina. Mogući formati odgovora su HTML, XML i
JSON.
Na primer, podaci o posetiocu, gde se servis poziva pomoću AJAX-a, mogu da budu
prikazani na sledeći način:
klijent_ajax.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#dugme").click(function(){
$.getJSON("http://api.hostip.info/get_json.php", function(data){
$("#rezultat").html("Vaša država je: "+data.country_name);
});
});
});
</script>
</head>
<body>
<h2>Geolokacija</h2>
<form method="GET" action="" id="forma">
<input type = "button" value = "Prikaži podatke o posetiocu" id="dugme"/>
<div id ="rezultat"></div><br/>
</form>
</body>
21
</html>
Servis je moguće pozvati i direktno preko PHP-a. U ovom primeru biće korišćen XML format
odgovora servisa:
klijent_xml.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<?php
//VEOMA VAŽNO: Ovde je bitno zadati IP adresu klijenta kao parametar. Pošto
zahtev ne ide preko AJAX-a, klijent veb servisa je
//u stvari server na kome se nalazi ova PHP skripta, pa ukoliko parametar
ip nije prosleđen, veb servis će uzeti IP adresu
//servera (u ovom slučaju, postoji tri aktera: klijent/browser; server;
javni veb servis).
$url = 'http://api.hostip.info/get_xml.php?ip='.$_SERVER['REMOTE_ADDR'];
$curl = curl_init($url);
//za FON-ovu mrezu treba podesiti proksi. Za ostale mreze linije za proksi
treba da budu pod komentarom
curl_setopt($curl, CURLOPT_PROXY, 'proxy.fon.rs:8080');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, false);
$curl_odgovor = curl_exec($curl);
curl_close($curl);
$xml = new SimpleXMLElement($curl_odgovor,null,false);
$cvor = $xml->xpath('//gml:featureMember');
echo ("Vaša lokacija je: ".$cvor[0]->Hostip->countryName);
?><br/>
<img src = "http://api.hostip.info/flag.php?ip=<?php echo
$_SERVER["REMOTE_ADDR"]?>" alt = "Zastava" />
</body>
</html>
22
2.7.4 Primer 4 – Feedzilla http://feedzilla.com/api-overview
http://api.feedzilla.com/v1/categories/id_kategorije/articles.format
http://api.feedzilla.com/v1/categories/30/articles.json
klijent.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<?php
//Zameniti URL putanjom serverskog dela REST servisa i zameniti vrednost
API ključa
$url = 'http://api.feedzilla.com/v1/categories/30/articles.json';
$curl = curl_init($url);
//za FON-ovu mrezu treba podesiti proksi. Za ostale mreze linije za proksi
treba da budu pod komentarom
curl_setopt($curl, CURLOPT_PROXY, 'proxy.fon.rs:8080');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, false);
$curl_odgovor = curl_exec($curl);
curl_close($curl);
$parsiran_json = json_decode ($curl_odgovor);
foreach ($parsiran_json->articles as $clanak){
echo ('<a href="'.$clanak->source_url.'">'.$clanak->title.'</a>');
echo ('<br/>');
}
?>
</body>
</html>
23
2.7.5 Primer 5 – ReCaptcha http://www.google.com/recaptcha
Slika 4 ReCaptcha
Nakon izbora opcije Create Key, biće kreiran javni i privatni API ključ koji se kasnije koristi
prilikom pozivanja ReCaptcha API-ja. Javni ključ se koristi za komunikaciju korisničkog
browser-a i ReCaptcha servisa, a privatni ključ služi za komunikaciju između servera gde se
hostuje skripta koja koristi ReCaptcha servis i samog ReCaptcha servisa.
24
Da bi se ReCaptcha koristila sa PHP-om, potrebno je preuzeti odgovarajuću PHP biblioteku
sa adrese https://developers.google.com/recaptcha/docs/php. Sa mreže FON-a (zbog
upotrebe Proxy servera) bi trebalo koristiti modifikovanu verziju biblioteke sa Moodle-a.
Nakon raspakivanja fajla, potrebno je sačuvati fajl recaptchalib.php u folderu na serveru gde
se nalazi PHP projekat koji koristi ReCaptcha servis.
recaptcha.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<form action="" method="POST">
Ime: <input type="text" name="ime" /><br/>
<?php
require_once('recaptchalib.php'); //potrebno je da se biblioteka nalazi u
folderu
$publickey = "JAVNI_KLJUČ"; //Promeniti javni ključ
$privatekey = "PRIVATNI_KLJUČ"; //promeniti privatni ključ
echo recaptcha_get_html($publickey);
?>
<input type="submit" value="Pošalji" />
</form>
<?php
//obrada forme
if (isset ($_POST["ime"])){
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// Kod se izvršava ako ReCaptcha kod nije pravilno unet
die ("Kod nije uspešno unet! Pokušajte ponovo!" .
"(reCAPTCHA greška: " . $resp->error . ")");
} else {
// Ako je uspešno unet kod
echo "Uneto ime je: ".$_POST['ime'];
}
}
?>
</body>
</html>
PDF Crowd predstavlja javni veb servis za generisanje PDF fajlova. Ovaj servis nije
besplatan, ali poseduje mogućnost kreiranja besplatnog naloga za testiranje koji omogućava
generisanje ograničenog broja PDF dokumenata.
25
Slika 5 Sign Up
Zatim, treba izabrati opciju HTML to PDF API, pa dugme Try It.
Prilikom registracije je neophodno uneti validnu e-mail adresu na koju stiže aktivacioni mejl.
Potrebno je kliknuti na aktivacioni link iz mejla da bi se završilo sa registracijom.
Zatim je potrebno ulogovati se na sajt i kliknuti na korisničko ime u gornjem desnom uglu
ekrana.
Na navedenom ekranu je prikazan API ključ koji se koristi prilikom svakog API poziva.
26
Slika 8 API ključ
Nakon ovog koraka, moguće je pozivati API koji vrši generisanje PDF fajla.
Rezultat POST zahteva je sirov PDF fajl, koji se može odmah prikazati ili preuzeti sa
servera.
Za ovaj primer, koristiće se gotov HTML fajl koji će se konvertovati u PDF pomoću PHP
skripte koja poziva REST veb servis.
HTML fajl proba.html
<!DOCTYPE html>
<html>
<head>
<style>
h1
{
background-color:#6495ed;
27
}
p
{
background-color:#e0ffff;
}
div
{
background-color:#b0c4de;
}
</style>
</head>
<body>
</body>
</html>
Umesto ovog fajla moguće je koristiti bilo koji drugi HTML fajl.
<?php
//podesava se Mime Type pogodan za PDF format
header('Content-Type: application/pdf');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='Type=text/html; charset=utf-8'>
<title>Primer</title>
</head>
<body>
<?php
//putanja do PDFCrowd REST API endpoint-a
$url = 'http://pdfcrowd.com/api/pdf/convert/html/';
//iniciranje HTTP CURL zahteva
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//za FON-ovu mrezu treba podesiti proksi. Za ostale mreze linije za proksi
treba da budu pod komentarom
curl_setopt($curl, CURLOPT_PROXY, 'proxy.fon.rs:8080');
//kreiranje post parametara. Treba uneti odgovarajuce podatke. Ovde
parametar src ucitava html fajl i prosledjuje ga
//veb servisu
$fields = array(
'src' => urlencode(file_get_contents('proba.html')),
'username' => urlencode('OVDE_UPISATI_USERNAME'),
'key' => urlencode('OVDE_UPISATI_API_KEY')
);
28
curl_setopt($curl,CURLOPT_POST, true);
//prosledjuju se prethodno pripremljeni post parametri
curl_setopt($curl,CURLOPT_POSTFIELDS, $fields_string);
//izvrsava se CURL zahtev
$curl_odgovor = curl_exec($curl);
//zatvara se CURL konekcija
curl_close($curl);
//ispisuje se PDF na ekranu, koji je dobijen kao odgovor na HTTP CURL
zahtev
echo $curl_odgovor;
?>
</body>
</html>
29
Primeri ostalih javnih REST veb servisa
30