You are on page 1of 30

FAKULTET ORGANIZACIONIH NAUKA

LABORATORIJA ZA ELEKTRONSKO POSLOVANJE

INTERNET TEHNOLOGIJE

REST veb servisi


Korišćenje gotovih REST API-ja
SADRŽAJ
1 Servisno orijentisana arhitektura i veb servisi ................................................................ 3
2 REST veb servisi ........................................................................................................... 4
2.1 HTTP protokol......................................................................................................... 4
2.2 Osnovni koncepti REST-a ....................................................................................... 8
2.3 Osnovni principi REST-a ......................................................................................... 8
2.4 Poređenje SOAP i REST pristupa ........................................................................... 9
2.5 Potrebne komponente za REST veb servise ......................................................... 10
2.6 Kreiranje veb servisa ............................................................................................ 11
2.6.1 Korišćenje funkcije file_get_contents() ........................................................... 11
2.6.2 Korišćenje CURL biblioteke ........................................................................... 14
2.7 Primeri REST klijenata koji pozivaju gotove servise .............................................. 16
2.7.1 Primer 1 – Kursna lista http://rate-exchange.appspot.com ............................. 16
2.7.2 Primer 2 – Vremenska prognoza http://www.worldweatheronline.com/ .......... 18
2.7.3 Primer 3 – Geolokacija http://www.hostip.info/use.html .................................. 21
2.7.4 Primer 4 – Feedzilla http://feedzilla.com/api-overview .................................... 23
2.7.5 Primer 5 – ReCaptcha http://www.google.com/recaptcha .............................. 24
2.7.6 Primer 6 – PDF Crowd http://pdfcrowd.com/ .................................................. 25

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 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

Alternativa korišćenju veb servisa zasnovanih na strogim standardima (SOAP, WSDL) su


veb servisi koji koriste REST (Representational State Transfer). REST nije konkretan
standard, već stil arhitekture koji se zasniva na često korišćenim tehnologijama i
protokolima. Glavna implementacija ove arhitekture je HTTP protokol u kombinaciji sa URI-
jima, odnosno world wide web.

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:

1. Klijent-server. Uniformni interfejs odvaja klijente od servera. Na primer, klijenti


nemaju veza sa skladištenjem podataka ili sa poslovnom logikom.
2. Bez stanja. Kontekst klijenta se nikada ne skladišti na serveru. Ne koristi se princip
kukija ili sesije. Komunikacija se ostvaruje isključivo razmenom zahteva i odgovora.
3. Mogućnost keširanja. Aplikacioni programer treba da definiše da li će se odgovori
veb servisa keširati ili ne.
4. Slojevit sistem. Klijent ne zna eksplicitno da li je povezan sa krajnjim serverom ili
nekim posrednikom. Serveri-posrednici mogu da omoguće veći stepen skalabilnosti
uvođenjem load-balancing pravila i omogućavanjem keširanja.
5. Uniformni interfejs. Ova karakteristika pojednostavljuje arhitekturu, što omogućava
nezavisni razvoj različitih komponenata veb servisa.
6. Kod na upit (opciono). Serveri mogu privremeno da prošire ili da prilagode
funkcionalnosti klijenta prenosom izvršnog koda. Na primer, ova funkcionalnost se
može postići uvođenjem unapred kompajliranih komponenata kao što su Java apleti
ili uvođenjem skriptova klijentske strane, kao što je JavaScript.

Ukoliko servis zadovoljava prvih pet ograničenja, takav servis predstavlja primer RESTful
servisa.

2.1 HTTP protokol


HTTP (Hypertext Transfer Protocol) predstavlja protokol aplikacionog sloja. REST servisi
najčešće koriste HTTP protokol za slanje zahteva i prijem odgovora. Trenutno aktuelna
verzija HTTP-a je 1.1, objavljena juna 1996. godine.

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:

Slika 1 HTTP zahtev (sp je razmak, a cr lf se odnosi na prelazak u novi red)

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

Odgovor bilo kod HTTP zahteva je u sledećem formatu:

verzija_HTTP-a statusni_kod statusna_poruka


header
prazan_red
body (odnosno sadržaj dokumenta sa servera)

Na primer, odgovor prethodnog zahteva bi bio u sledećem formatu:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
</head>
<body>

</body>

5
</html>

Ukoliko se parametri šalju korišćenjem GET metode, zahtev neće biti bitno promenjen,
odnosno parametri se šalju u URL-u:

GET /?pretraga=kljucna_rec HTTP/1.1


Host: www.fon.rs
prazan_red
prazan_red_u_body_delu

Za slanje parametara preko POST metode, zahtev izgleda ovako:

POST /registracija.php HTTP/1.1


Host: www.nekisajt.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length

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:

• Accept Content- Tipovi podataka koji su prihvatljivi


 Accept: text/plain
• Content-Type- Tip podataka koji se očekuje da bude u odgovoru servera
 Content-Type: application/xml
• Accept-Language - Jezici koji su prihvatljivi u odgovoru
 Accept-Language: en
• Connection - Koju vrstu konekcije zahteva korisnički agent
 Connection: close
• Cookie – HTTP kuki prethodno poslat od strane servera
 Cookie: $Version=1; UserId=JohnDoe
• Date - datum i vreme kada je poruka poslata
 Date: Tue, 15 Nov 1994 08:12:31 GMT
• Host - Ime domena servera
 Host: myelab.net
• If-Modified-Since - dozvoljava odgovor 304 Not Modified, ako nije bilo
promene zahtevanog sadržaja
 If-Modified-Since: Sat, 29 Oct 1994 19:43:31

Zahtevi i odgovori HTTP protokola su u tekstualnom formatu. Postavlja se pitanje šta se


dešava u slučaju zahtevanja binarnog fajla, npr. slike ili MP3 pesme.

Navedeni problem se prevazilazi upotrebom MIME standarda. MIME


(Multipurpose Internet Mail Extensions) predstavlja standard pomoću koga se binarni brojevi
prenose u tekstualni format. Tekst se sastoji iz niza slova i brojeva, odnosno simbola. U
ASCII formatu za jedan simbol potreban je 1 bajt, odnosno 8 bita. Da bi se binarna
informacija (multimedijalna) prevela u tekstualni format koji je zgodan za prenos preko
mreže, potrebno je da se prvo bitovi te informacije prevedu u heksadecimalne brojeve, koji
istovremeno predstavljaju karaktere ASCII tabele. Jedna heksadecimalna cifra sadrži 4 bita,

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

Ali odgovor izgleda ovako:

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.

Dobar dodatni materijal u vezi sa HTTP protokolom nalazi se na adresi


http://www3.ntu.edu.sg/home/ehchua/programming/webprogramming/http_basics.html. Za
debug-ovanje HTTP zahteva i odgovora, dobro je koristiti besplatan program Fiddler, koji je
moguće preuzeti sa adrese http://www.fiddler2.com/fiddler2/version.asp. Ovaj program
instalira sopstveni lokalni proxy server koji prati ceo HTTP saobraćaj ostvaren putem web
browser-a u kojima je podešen ovaj proxy. Takođe, moguće je slati sopstvene HTTP
zahteve, izborom opcije Composer, kojoj se pristupa preko menija View -> Composer, ili
jednostavnim pritiskom tastera F9.

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.

Na primer, adresa http://fon.rs je identifikator početne stranice FON-ovog sajta.


Učitavanjem stranice u pretraživač dobija se njena reprezentacija, odnosno prikaz. Klikom
na neki od linkova sa ove stranice, dolazi do prelaska na neku drugu stranicu, u ovom
kontekstu neko drugo stanje aplikacije.

2.3 Osnovni principi REST-a

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:

<narudzbina self='http://primer.com/klijenti/1234' >


<kolicina>23</kolicina>
<proizvod ref='http://primer.com/proizvodi/4554' />
<klijent ref='http://primer.com/klijenti /1234' />
</narudzbina>

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:

GET http//fon.rs HTTP/1.1

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:

GET http//fon.rs?akcija=obrisi HTTP/1.1

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.

5. Komunikacija se obavlja bez pamćenja stanja.

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

 REST se uglavnom zasniva na HTTP-u, mada nije obavezno


 REST je dosta jednostavan, ne koristi SOAP i WSDL
 Koristi standardne HTTP-ove metode (GET, POST, PUT, DELETE, HEAD)
 Resurs je osnovni koncept - sve je resurs i sve operacije se vrše nad resursima
 Dovoljan je programski jezik koji ima HTTP bibiloteku da bismo koristili REST servise

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>

Sa druge strane, ako se koristi REST, kompletan zahtev bi izgledao ovako:

GET http://www.acme.com/phonebook/UserDetails/12345 HTTP/1.1

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

Za reprezentaciju klasičnih veb stranica u ljudski čitljivom formatu koristi se HTML; za


reprezentaciju drugih resursa, npr. podataka o klijentu identifikovanih URI-jem:

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

Po „čistom“ REST-u, metode HTTP-a treba da obezbeđuju funkcionalnosti koje se često


opisuju akronimom CRUD (Create, Retreive, Update, Delete). U stvarnosti, servisi obično
koriste samo GET i POST metode.

Metoda CRUD operacija Opis

GET Retreive Dobavlja reprezentaciju resursa


HEAD Dobavlja metapodatke koji opisuju reprezentaciju resursa
POST Create Strogo posmatrano, POST pravi novi resurs. U stvarnosti,
POST se koristi za kreiranje, ažuriranje i brisanje resursa.
REST servisi obično podržavaju samo GET i POST
metode.
PUT Update Ažurira resurs. Ne viđa se često, njenu funkciju obično
preuzima POST metoda.
DELETE Delete Briše resurs. Isto kao PUT, najčešće se POST koristi
umesto ove 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

2.6 Kreiranje veb servisa


REST veb servisi se sastoje iz klijentskog i serverskog dela. Ovi delovi mogu, ali ne moraju
da budu na istom serveru. Na primer, klijentski i serverski deo nisu na istom serveru kada se
koristi neki gotov REST API (npr. dobavljanje trenutne temperature, kursne liste, vesti sa
Twitter-a i sl.).

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.

2.6.1 Korišćenje funkcije file_get_contents()


Funkcija file_get_contents() omogućava jednostavno pribavljanje lokalnog ili udaljenog
resursa. Ova funkcija nije toliko fleksibilna, jer ne omogućava rad sa naprednijim
parametrima vezanim za obradu HTTP zahteva i odgovora.

Primer servisa koji koristi POST metodu

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;
}

// Namešta tip sadržaja odgovora na XML


header('Content-type: text/xml');
echo '<?xml version="1.0"?>';
$errors = array();
if (isset($_GET['num1']) && isset($_GET['num2'])) {
echo sabiranje((int)$_GET['num1'], (int)$_GET['num2']);
} else {
echo "Problem sa prosledjenim parametrima";
}
?>

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';

// sklapa se URL sa parametrima koji ce biti prosledjeni GET metodom


$url = $server.$path.'?num1=5&num2=12';
// kreira se objekat
$dom = new DOMDocument();
// Ucitava rezultat izvrsenja naseg servisa (XML)
$dom->load($url);
// stampa kompletan dobijeni XML
echo "<xmp>" . $dom->saveXML() . "<\xmp>\n";
?>

Primer servisa koji koristi POST metodu

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';

// Funkcija koja pravi POST zahtev pomocu PHP streamova


// $url - adresa na koju se salje POST zahtev
// $data - podaci, odnosno parametri koji se salju na zadati URL
function make_post_request($url, $data) {
// niz koji sadrzi kompletan HTTP zahtev, metodu (POST), zaglavlje
(header) i sadrzaj (content)
$opts = array(
'http'=>array('method'=>"POST", 'content'=>$data,
'header'=>"Content-Type: application/x-www-form-urlencoded\r\n"));
$context = stream_context_create($opts);
// salje HTTP zahtev nasem servisu, vraca dobijeni rezultat (XML)
return file_get_contents($url, FALSE, $context);
}

// podaci koji će biti poslati


$data = 'akcija=nekaAkcija';
// adresa servisa
$url = $server.$path;
// zovemo našu f-ju koja pravi HTTP POST zahtev i štampamo njen rezultat
print "<xmp>" . make_post_request($url, $data)."</xmp>";
?>

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:

Slika 2 Prikaz izbora php_curl ekstenzije

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.

Korišćenje CURL-a je jednostavno. Kreiranje REST klijenta sastoji se iz četiri koraka:

1. Inicijalizacija CURL zahteva, odnosno otvaranje konekcije (naredba curl_init());


2. Podešavanje opcija CURL zahteva (naredba curl_setopt());
3. Izvršavanje CURL zahteva (naredba curl_exec());
4. Zatvaranje CURL konekcije (naredba curl_close()).

U prvom koraku se inicijalizuje zahtev korišćenjem naredbe curl_int($url). Navedena


naredba prima jedan ulazni parametar, a to je string koji sadrži URL stranice koja se
zahteva. Ovako inicijalizovan zahtev bi trebalo sačuvati u nekoj promenljivoj, zbog narednih
koraka. Na primer, jedan zahtev se može inicijalizovati na sledeći način:

$curl_zahtev = curl_init("http://www.fon.rs");

U sledećem koraku je potrebno korišćenjem naredbe curl_setopt($curl_zahtev,


$naziv_opcije, $vrednost_opcije) podesiti sve opcije vezane za zahtev. Pomoću ovih opcija,
moguće je izabrati željenu metodu (POST, GET, PUT, DELETE) ako je HTTP zahtev u
pitanju, ali i proslediti vrednosti POST ili GET parametara. Dakle, metoda curl_setopt prima
tri ulazna parametra. Prvi parametar je promenljiva koja je kreirana u prvom CURL koraku i
koja sadrži inicijalizovan CURL zahtev, drugi parametar predstavlja naziv opcije čija se
vrednost postavlja (uzima se predefinisana PHP konstanta, pošto postoji ograničen broj

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 :

Opcija Opis i moguće vrednosti Tip


vrednosti
CURLOPT_HTTPGET TRUE, ako je metoda zahteva GET bool
CURLOPT_POST TRUE, ako je metoda zahteva POST bool
CURLOPT_PUT TRUE, ako je metoda zahteva PUT bool
CURLOPT_CUSTOMREQUEST Podešava tip zahteva. Koristi se kod manje string
standardnih zahteva, na primer kod DELETE
metode:
curl_setopt($curl_zahtev,
CURLOPT_CUSTOMREQUEST, "DELETE");
CURLOPT_POSTFIELDS Parametri koji se šalju preko POST metode. string
Parametri su u sledećem formatu:
par1=vred1&par2=vred2&par3=vred3 itd.
CURLOPT_PROXY Definiše se proxy server, ukoliko CURL zahtevi string
treba da idu preko njega. Npr:
http://proxy.fon.rs:8080
CURLOPT_HTTPHEADER Definiše sve HTTP header-e koji treba da budu array
poslati. Vrednosti header-a se definišu kao niz.
Npr.
array('Content-type: text/plain',
'Content-length: 100')

U trećem koraku se izvršava pripremljen CURL zahtev, korišćenjem naredbe


curl_exec($curl_zahtev). Ova naredba prima samo jedan parametar, a to je naziv
promenljive u kojoj je zahtev inicijalizovan. Izvršavanjem naredbe curl_exec() dolazi do
fizičkog slanja zahteva na udaljeni server. Ova funkcija vraća odgovor sa servera kao
povratnu vrednost, stoga je dobro sačuvati poziv ove funkcije u posebnoj varijabli:

$curl_odgovor = curl_exec($curl_zahtev);

Kasnije je potrebno parsirati odgovor, pošto je on najčešće u XML ili JSON formatu.

Konačno, nakon dobijenog odgovora sa servera, potrebno je zatvoriti CURL konekciju. To je


moguće uraditi pozivanjem funkcije curl_close($curl_zahtev). Jedini ulazni parametar ove
funkcije jeste varijabla u kojoj je prethodno sačuvan inicijalizovan CURL zahtev:

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

2.7.1 Primer 1 – Kursna lista http://rate-exchange.appspot.com

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

Odgovor je u JSON formatu. Primer odgovora je sledeći:

{"to": "RSD", "rate": 114.542, "from": "EUR", "v": 1145.4200000000001}

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>

2.7.2 Primer 2 – Vremenska prognoza


http://www.worldweatheronline.com/

Ovaj servis za vremensku prognozu omogućava dobijanje vremenskih podataka u XML,


JSON ili CSV formatu, za veliki broj gradova. Neophodna je besplatna registracija, nakon
koje se dobija API ključ.

Format GET zahteva je sledeći:

http://api.worldweatheronline.com/free/v1/weather.ashx?q=Belgrade,Serbia&fo
rmat=json&num_of_days=2&key=API_KLJUČ

Od parametra se prosleđuju sledeće promenljive:

Parametar Značenje Moguća vrednost

q Željena lokacija Belgrade,Serbia


format Željeni format odgovora json ili xml
num_of_days Broj dana za koje će se 2,3 ili 4
prikazati prognoza
key API ključ vrednost dobijenog API ključa

Primer odgovora veb servisa:

{
"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"
}
]
}
}

Dakle, odgovor se sastoji iz sledećih varijabli:

 current_condition – snimak trenutnog vremenskog stanja


 request – podaci o zahtevu
 weather – vremenska prognoza za nekoliko narednih dana

Na primer, ukoliko želimo da kreiramo klijenta koji će prikazati trenutnu temperaturu u


Beogradu, dobijeni odgovor sa servera treba adekvatno parsirati:

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.

1. Lociranje IP adrese klijenta (pogodno je za AJAX)


 HTML format
 http://api.hostip.info/get_html.php
 XML format
 http://api.hostip.info/get_xml.php
 JSON format
 http://api.hostip.info/get_json.php
2. Lociranje bilo koje IP adrese
 HTML format
 http://api.hostip.info/get_html.php?ip=147.91.130.3
 XML format
 http://api.hostip.info/get_xml.php?ip=147.91.130.3
 JSON format
 http://api.hostip.info/get_json.php?ip=147.91.130.3
3. Generisanje slike zastave države klijenta
 http://api.hostip.info/flag.php
4. Generisanje slike zastave države iz koje je bilo koja IP adresa
 http://api.hostip.info/flag.php?ip=147.91.130.3

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

Feedzilla predstavlja agregator vesti, koje su grupisane po različitim kategorijama. Moguće


je izabrati format u kome će biti dobijen odgovor od servera (XML, JSON, RSS, Atom feed).
Takođe postoji mogućnost prikaza liste kategorija, podkategorija, liste vesti i pojedinačnih
vesti. Za ovaj servis nije potreban API ključ.

Zahtevi se šalju u sledećem formatu:

http://api.feedzilla.com/v1/categories/id_kategorije/articles.format

Na primer, da bi se prikazale vesti iz kategorije 30 (tehnologija) u JSON formatu, potrebno je


poslati sledeći zahtev:

http://api.feedzilla.com/v1/categories/30/articles.json

Klijent koji prikazuje vesti iz tehnologije izgleda ovako:

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

ReCaptcha je besplatan servis koji omogućuje verifikaciju da li je posetilac sajta koji


popunjava neku formu ljudsko biće. Ova provera je veoma korisna za sprečavanje spam-
ova, pošto još uvek nije razvijen toliko dobar algoritam za nepogrešivo optičko
prepoznavanje teksta. ReCaptcha se razlikuje od ostalih Captcha servisa po tome što je
besplatna i što pomaže digitalizaciji knjiga. Naime, ReCaptcha kao zagonetku postavlja dve
reči. Korisnik obe reči prepisuje, ali ReCaptcha „zna“ samo jednu reč, a druga reč koju
korisnik upiše beleži se u bazu prepoznavanja optičkih karaktera.

Da bi se koristila ova usluga, neophodna je besplatna registracija na sajtu ReCaptcha. Za


registraciju se koristi postojeći Google nalog, koji se inače koristi za ostale Google usluge,
kao što je Gmail. Zatim je potrebno definisati domen na kome će se koristiti ReCaptcha, a
moguće je izabrati da ReCaptcha bude dostupna na bilo kom domenu.

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>

2.7.6 Primer 6 – PDF Crowd http://pdfcrowd.com/

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.

Za registraciju na ovaj servis potrebno je kliknuti na početnoj stranici PDF Crowd-a na


dugme Sign Up:

25
Slika 5 Sign Up

Zatim, treba izabrati opciju HTML to PDF API, pa dugme Try It.

Slika 6 Izbor besplatne opcije

U sledećem koraku je potrebno popuniti formu sa podacima za registraciju.

Slika 7 Kreiranje naloga

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.

Detaljna specifikacija API-a nalazi se na adresi https://pdfcrowd.com/html-to-pdf-api/#api-


reference . Za generisanje PDF-a, moguće je koristiti sledeće obavezne osnovne POST
parametre:

Naziv parametra Vrednost parametra


src naziv fajla koji se konvertuje u PDF
username korisničko ime
key ključ (ne lozinka) koji je generisan

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>

<h1>CSS background-color example!</h1>


<div>
This is a text inside a div element.
<p>This paragraph has its own background color.</p>
We are still in the div element.
</div>

</body>
</html>

Umesto ovog fajla moguće je koristiti bilo koji drugi HTML fajl.

PHP fajl pdf_konvert.php

<?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')
);

//konvertovanje niza u format pogodan za slanje POST zahteva


foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
//koristi se POST metoda

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

 Wolfram Alpha – API za matematičke proračune


o http://products.wolframalpha.com/developers/
 RANDOM – Generator slučajnih brojeva
o http://www.random.org/
 Apigee Oauth – API za autentifikaciju putem Oauth protokola
o http://developer.apigee.com/
 Google Books – API za pretragu knjiga
o https://developers.google.com/books/docs/v1/using
 Flicker – API servisa za deljenje slika
o http://www.flickr.com/services/api/
 BING API
o http://www.bing.com/developers/
 Twitter API
o https://dev.twitter.com/docs

30

You might also like