0% found this document useful (0 votes)
107 views30 pages

REST Service - Flight Framework

The document describes the steps to create a REST web service project using the Flight PHP micro framework. It includes installing Flight, setting up a database with tables for news and categories, creating a Database class to connect to the database and perform CRUD operations, and defining routes to handle HTTP requests and return JSON responses from the database.

Uploaded by

the_mish
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
107 views30 pages

REST Service - Flight Framework

The document describes the steps to create a REST web service project using the Flight PHP micro framework. It includes installing Flight, setting up a database with tables for news and categories, creating a Database class to connect to the database and perform CRUD operations, and defining routes to handle HTTP requests and return JSON responses from the database.

Uploaded by

the_mish
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 30

FAKULTET ORGANIZACIONIH NAUKA

LABORATORIJA ZA ELEKTRONSKO POSLOVANJE


INTERNET TEHNOLOGIJE

REST veb servisi


Mikro razvojni okvir Flight

SADRAJ
1

Flight framework ............................................................................................................ 3

Kreiranje projekta .......................................................................................................... 3

2.1

Instalacija Flight framework-a ................................................................................. 3

2.2

Postavljanje baze podataka .................................................................................... 4

2.3

Kreiranje PHP klase za rad sa bazom ..................................................................... 5

2.4

Definisanje ruta ....................................................................................................... 8

2.5

GET ruta /novosti.json .......................................................................................... 11

2.6

GET ruta /novosti/:id.json ...................................................................................... 12

2.7

GET ruta /kategorije.json ...................................................................................... 12

2.8

GET ruta /kategorije/:id.json .................................................................................. 13

2.9

POST ruta /novosti................................................................................................ 13

2.10

POST ruta /kategorije ........................................................................................ 14

2.11

PUT ruta /novosti/:id .......................................................................................... 15

2.12

PUT ruta /kategorije/:id ...................................................................................... 16

2.13

DELETE ruta /novosti/:id ................................................................................... 17

2.14

DELETE ruta /kategorije/:id ............................................................................... 17

2.15

Kompletna stranica index.php ........................................................................... 18

Kreiranje dokumentacije REST servisa ....................................................................... 24


3.1

Dokumentacija projekta ........................................................................................ 24

1 Flight framework
Flight je specijalizovani PHP framework namenjen prvenstveno razvoju REST
servisa. Osnovna funkcionalnost ovog framework-a je rutiranje, odnosno
jednostavno kreiranje funkcija koje odgovaraju na HTTP zahteve upuene
korienjem neke standardne HTTP metode (GET, POST, PUT, DELETE). Flight je
objektno-orijentisan framework i moe se koristiti bilo pozivanjem statikih metoda
koje su definisane u klasama Flight-a, bilo instanciranjem novog objekta. U ovoj
skripti e biti koriene statike metode. Mogue je definisanje sopstvenih globalnih
promenljivih u Flight-u, segmentno rutiranje, korienje Flight-a za automatizaciju
dodavanja HTML templejta i dr.

2 Kreiranje projekta
U daljem tekstu e biti opisan postupak kreirana jednostavnog REST veb servisa koji koristi
Flight framework. Servis e koristiti REST nain rutiranja, to znai da e koristiti lepe URL
adrese za manipulaciju sa bazom podataka. Koristie se sve etiri HTTP metode: GET,
POST, PUT, DELETE. Poziv GET metode e se koristiti za vraanje JSON ili XML
dokumenta sa podacima iz baze, POST metoda e biti koriena za dodavanje novog
zapisa u odgovarajuu tabelu u bazi, PUT e se koristiti za izmenu, a DELETE za brisanje
zapisa.

2.1 Instalacija Flight framework-a


Za korienje Flight PHP framework-a u projektu, neophodno je preuzeti fajl sa adrese
http://flightphp.com/install . Nakon preuzimanja fajla, fajl je neophodno raspakovati. U folderu
projekta (npr. C:\wamp\www\rest), potrebno je da se nalazi sadraj foldera mikecao-flight5414b90 iz arhive. Dakle, ukoliko je folder projekta C:\wamp\www\rest, u okviru njega bi
trebalo da se nalaze fajlovi composer.json, index.php i folderi flight i tests.
Nakon kopiranja fajlova, treba kreirati fajl .htaccess u folderu projekta. Ovaj fajl nije mogue
kreirati iz svih programa (poto naziv fajla poinje takom). Trebalo bi koristiti neki
specijalizovan editor teksta (kao to je Notepad++). U Notepad++ editoru, ovakav fajl se
kreira izborom opcije File -> Save As. U dijalogu se unosi .htaccess (obavezno sa takom na
poetku fajla) u polje File Name, a u padajuoj listi Save As Type treba izabrati All Types
(*.*). Sadraj .htaccess fajla je sledei:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /putanja_do_foldera_projekta/index.php [QSA,L]

Na primer, ukoliko se projekat nalazi na lokaciji http://localhost/rest, a fajlovi projekta u


folderu C:\wamp\www\rest, .htaccess fajl e biti sledeeg sadraja:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /rest/index.php [QSA,L]

Konano, neophodno je ukljuiti Apache Rewrite modul koji omoguava prepisivanje URLova u skladu sa .htaccess pravilom. Ukoliko se koristi WAMP server, to je mogue uraditi
levim klikom na ikonicu WAMP servera u taskbar-u, zatim izborom opcije Apache->Apache
modules->rewrite_module. Kod ostalih softverskih reenja baziranih na Apache serveru
(XAMPP, MAMP, LAMP, EasyPHP i dr.), rewrite modul se ukljuuje runom izmenom
Apache konfiguracionog fajla.

2.2 Postavljanje baze podataka


Za potrebe projekta potrebno je kreirati bazu. U ovom primeru, naziv baze e biti rest:
CREATE DATABASE IF NOT EXISTS `rest` DEFAULT CHARACTER SET utf8 COLLATE
utf8_unicode_ci;
USE `rest`;

Baza e imati dve tabele: kategorije i novosti:


CREATE TABLE IF NOT EXISTS `kategorije` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kategorija` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=4 ;
CREATE TABLE IF NOT EXISTS `novosti` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`naslov` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`tekst` text COLLATE utf8_unicode_ci NOT NULL,
`datumvreme` datetime NOT NULL,
`kategorija_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=6 ;

Konano, potrebno je ubaciti podatke u tabele:


INSERT INTO `kategorije` (`id`, `kategorija`) VALUES
(1, 'IT'),
(2, 'Automobili'),
(3, 'Zabava');
INSERT INTO `novosti` (`id`, `naslov`, `tekst`, `datumvreme`,
`kategorija_id`) VALUES
(1, 'Facebook uveo dislike za Messenger', 'Like dugme postalo je ikona
socijalnih mrea, i oigledno, Facebooka. Meutim, postoje trenuci kada je
potrebno i dislike dugme, ali ono nije postojalao, do sada.', '2013-12-18
00:55:38', 1),
(2, 'Amazonov telefon stie 2014?', 'Glasine u vezi sa moguim smartfonom
kompanije Amazon postoje ve neko vreme, ali ini se da se polako bliimo
datumu predstavljanja.', '2013-12-18 00:56:21', 1),
4

(3, 'Godinji e-otpad kao 11 Keopsovih piramida', 'Jedan od vodeih


globalnih ekolokih problema je elektrini i elektronski otpad (e-otpad),
koji nastaje brzim zastarevanjem elektronskih ureaja.', '2013-12-18
00:57:20', 1),
(4, 'Kako je iveti prema Frenklinovom rasporedu?', 'Mnogo pre nego to su
nastale prve aplikacije za pravljenje rasporeda dnevnih obaveza, Bendamin
Frenklin je sa velikim uspehom planirao svoje zadatke.', '2013-07-15
12:15:28', 3),
(5, 'Kriza - a prodaja automobila u porastu', 'Prodaja novih automobila
porasla je u novembru u nekoliko zemalja Evropske unije koje su ozbiljno
uzdrmane krizom.', '2013-11-03 22:27:32', 2);

2.3 Kreiranje PHP klase za rad sa bazom


U folderu projekta je potrebno kreirati klasu Database.php. Ova klasa vri konekciju sa
bazom i sadri sve potrebne funkcije za izvravanje CRUD operacija.

<?php
class Database
{
private $hostname="localhost";
private $username="root";
private $password="";
private $dbname;
private $dblink; // veza sa bazom
private $result; // Holds the MySQL query result
private $records; // Holds the total number of records returned
private $affected; // Holds the total number of affected rows
function __construct($dbname)
{
$this->dbname = $dbname;
$this->Connect();
}
/*
function __destruct()
{
$this->dblink->close();
//echo "Konekcija prekinuta";
}
*/
public function getResult()
{
return $this->result;
}
//konekcija sa bazom
function Connect()
{
$this->dblink = new mysqli($this->hostname, $this->username, $this>password, $this->dbname);
if ($this->dblink ->connect_errno) {
printf("Konekcija neuspena: %s\n", $mysqli->connect_error);
exit();
}
$this->dblink->set_charset("utf8");
//echo "Uspesna konekcija";

}
//select funkcija
function select ($table="novosti", $rows = 'novosti.id, novosti.naslov,
novosti.tekst, novosti.datumvreme, novosti.kategorija_id,
kategorije.kategorija', $join_table="kategorije",
$join_key1="kategorija_id", $join_key2="id", $where = null, $order = null)
{
$q = 'SELECT '.$rows.' FROM '.$table;
if($join_table !=null)
$q .= ' JOIN '.$join_table.' ON
'.$table.'.'.$join_key1.' = '.$join_table.'.'.$join_key2;
if($where != null)
$q .= ' WHERE '.$where;
if($order != null)
$q .= ' ORDER BY '.$order;
$this->ExecuteQuery($q);
//print_r($this->getResult()->fetch_object());
}
function insert ($table="novosti", $rows = "naslov, tekst", $values)
{
$query_values = implode(',',$values);
$insert = 'INSERT INTO '.$table;
if($rows != null)
{
$insert .= ' ('.$rows.')';
}
$insert .= ' VALUES ('.$query_values.')';
//echo $insert;
if ($this->ExecuteQuery($insert))
return true;
else return false;
}
function update ($table="novosti", $id, $keys, $values)
{
$set_query = array();
for ($i=0; $i<sizeof($keys);$i++){
$set_query[] = $keys[$i] . " = '".$values[$i]."'";
}
$set_query_string = implode(',',$set_query);

$update = "UPDATE ".$table." SET ". $set_query_string ." WHERE id=". $id;
if (($this->ExecuteQuery($update)) && ($this->affected >0))
return true;
else return false;
}
function delete ($table="novosti", $keys, $values)
{
$delete = "DELETE FROM ".$table." WHERE ".$keys[0]." = '".$values[0]."'";
//echo $delete;
if ($this->ExecuteQuery($delete))
return true;
else return false;
}
//funkcija za izvrsavanje upita
function ExecuteQuery($query)
{
if($this->result = $this->dblink->query($query)){
6

if (isset($this->result->num_rows)) $this->records
>num_rows;
if (isset($this->dblink->affected_rows)) $this->affected
>dblink->affected_rows;
// echo "Uspesno izvrsen upit";
return true;
}
else
{
return false;
}
}

= $this->result= $this-

function CleanData()
{
//mysql_string_escape () uputiti ih na skriptu vezanu za bezbednost i
sigurnost u php aplikacijama!!
}
}
?>

Opciono, moe se kreirati fajl jsonindent.php gde e biti smetena funkcija Indent:
<?php
/**
* Indents a flat JSON string to make it more human-readable.
*
* @param string $json The original JSON string to process.
*
* @return string Indented version of the original JSON string.
*/
function indent($json) {
$result
$pos
$strLen
$indentStr
$newLine
$prevChar
$outOfQuotes

=
=
=
=
=
=
=

'';
0;
strlen($json);
' ';
"\n";
'';
true;

for ($i=0; $i<=$strLen; $i++) {


// Grab the next character in the string.
$char = substr($json, $i, 1);
// Are we inside a quoted string?
if ($char == '"' && $prevChar != '\\') {
$outOfQuotes = !$outOfQuotes;
// If this character is the end of an element,
// output a new line and indent the next line.
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
$result .= $newLine;
$pos --;
for ($j=0; $j<$pos; $j++) {
$result .= $indentStr;
}

}
// Add the character to the result string.
$result .= $char;
// If the last character was the beginning of an element,
// output a new line and indent the next line.
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes)
{
$result .= $newLine;
if ($char == '{' || $char == '[') {
$pos ++;
}
for ($j = 0; $j < $pos; $j++) {
$result .= $indentStr;
}
}
$prevChar = $char;
}
return $result;
}
?>

2.4 Definisanje ruta


Kreiranje sopstvenih ruta predstavlja osnovnu funkcionalnost Flight PHP framework-a. U
fajlu index.php nalazi se kompletna logika aplikacije koja koristi Flight PHP. Na poetku, fajl
index.php izgleda ovako:
<?php
require 'flight/Flight.php';
//ukoliko se kreirao fajl jsonindent.php
require 'jsonindent.php';
Flight::route('/', function(){
echo 'hello world!';
});
Flight::start();
?>

Dakle, prvo je potrebno ukljuiti fajl Flight.php da bi se koristio Flight framework. Zatim se
definiu rute. U ovom primeru, definisana je samo jedna ruta, /. Ova ruta se odnosi na
pristup root direktorijumu projekta. U sluaju ovog projekta, ruta / odnosi se na putanju
http://localhost/rest/. Poto prilikom definisanja ove podrazumevane rute nije definisana
metoda, poruka hello world! prikazae se prilikom pozivanja ove rute korienjem bilo koje
metode (GET, POST, PUT, DELETE).
Kada se stranici pristupa iz browser-a, koristi se GET metoda. Za testiranje ostalih metoda,
moe se koristiti neka posebna aplikacija ili ekstenzija za browser. Za Firefox, jedna od boljih
ekstenzija je HTTP Requester koja se besplatno moe preuzeti sa adrese
8

https://addons.mozilla.org/en-us/firefox/addon/httprequester/. Nakon instalacije, ekstenziji se


pristupa iz menija Tools -> HttpRequester ili korienjem preice CTRL ALT P.
Ova ekstenzija se koristi tako to se najpre u polje URL unese adresa na koju se alje HTTP
zahtev. Nakon toga se u polje Content unese eventualno telo HTTP zahteva (vai za POST,
PUT, DELETE, ali ne i za GET). U polju Content Type bira se MIME tip poslatog zahteva. Na
primer, ukoliko je zahtev u JSON formatu, bira se application/json. Na kraju, zahtev se alje
izborom odgovarajue metode iz padajue liste i klikom na taster SUBMIT.
Sa desne strane prozora, u delu Response, nakon slanja zahteva prikazuje se HTTP
statusni kod odgovora. Na primer, 200 OK, 404 Not Found i slino. Ispod statusa, prikazuje
se telo odgovora i zaglavlje odgovora.
Na slici 1 je prikazana ekstenzija HTTP requester.

Slika 1 HttpRequester

U ovom projektu bie kreirano nekoliko ruta. Za svaku CRUD operaciju nad bazom, koristie
se odgovarajua HTTP metoda. Dakle, bie dodate sledee rute:
Metoda
GET
GET

Ruta
/novosti.json
/novosti/:id.json

GET

/kategorije.json

GET

/kategorije/:id.json
9

Operacija
Prikaz svih novosti iz baze
Prikaz odreene novosti
Prikaz svih kategorija sa
novostima
Prikaz odreene kategorije

POST
POST
PUT
PUT
DELETE
DELETE

sa novostima iz te kategorije
Dodavanje nove novosti
Dodavanje nove kategorije
Izmena odreene novosti
Izmena odreene kategorije
Brisanje odreene novosti
Brisanje odreene kategorije

/novosti
/kategorije
/novosti/:id
/kategorije/:id
/novosti/:id
/kategorije/:id
Tabela 1 Operacije nad bazom

Da bi se radilo sa bazom, prvo je potrebno instancirati Database klasu u fajlu index.php. To


je mogue uraditi pomou Flight funkcije register, ime se objekat klase Database ubacuje
kao globalna Flight varijabla. Nakon toga, fajl index.php izgleda ovako:
<?php
require 'flight/Flight.php';
require 'jsonindent.php';
Flight::register('db', 'Database', array('rest'));
Flight::route('/', function(){
echo 'hello world!';
});
Flight::start();
?>

Sledei korak je definisanje Flight globalne promenljive koja ita podatke iz tela HTTP
zahteva:
<?php
require 'flight/Flight.php';
require 'jsonindent.php';
Flight::register('db', 'Database', array('rest'));
$json_podaci = file_get_contents("php://input");
Flight::set('json_podaci', $json_podaci );
Flight::route('/', function(){
echo 'hello world!';
});
Flight::start();
?>

Naredni korak je definisanje pomenutih ruta:


<?php
require 'flight/Flight.php';
require 'jsonindent.php';

10

Flight::register('db', 'Database', array('rest'));


$json_podaci = file_get_contents("php://input");
Flight::set('json_podaci', $json_podaci );
Flight::route('/', function(){
echo 'hello world!';
});
Flight::route('GET /novosti.json', function(){});
Flight::route('GET /novosti/@id.json', function($id){});
Flight::route('GET /kategorije.json', function(){});
Flight::route('GET /kategorije/@id.json', function($id){});
Flight::route('POST /novosti', function(){});
Flight::route('POST /kategorije', function(){});
Flight::route('PUT /novosti/@id', function($id){});
Flight::route('PUT /kategorije/@id', function($id){});
Flight::route('DELETE /novosti/@id', function($id){});
Flight::route('DELETE /kategorije/@id', function($id){});

Flight::start();
?>

Flight PHP poseduje mogunost definisanja razliitih varijabli u ruti. One se oznaavaju
prefiksom @. Ovde je koriena varijabla @id koja se prosleuje funkciji u okviru odreene
rute. U funkcijama se definie obrada zahteva za rute.
U ovom primeru su definisane GET rute sa sufiksom .json. Na primer, za vraanje novosti sa
id-jem 55 u JSON formatu, potrebno je poslati zahtev:
GET http://localhost/novosti/55.json
Na ovaj nain je mogue jednostavno kreirati funkciju servisa sa drugaijom rutom koja
vraa drugaiji format podataka. Na primer, mogue je kreirati rutu:
GET http://localhost/novosti/55.xml
Koja e vratiti istu novost, ali u XML formatu.
Naravno, mogue je koristitiAccept zaglavlje u zahtevu umesto odgovarajuih sufiksa u ruti
za izbor formata odgovora.

2.5 GET ruta /novosti.json


Ova ruta bi trebalo da vrati JSON dokument sa svim novostima iz baze. Novosti bi bile
struktuirane kao niz JSON objekata.
Flight::route('GET /novosti.json', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select();
$niz=array();

11

while ($red=$db->getResult()->fetch_object()){
$niz[] = $red;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;
});

2.6 GET ruta /novosti/:id.json


Flight::route('GET /novosti/@id.json', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("novosti", "*", "kategorije", "kategorija_id", "id",
"novosti.id = ".$id, null);
$red=$db->getResult()->fetch_object();
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($red,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;
});

2.7 GET ruta /kategorije.json


Flight::route('GET /kategorije.json', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("kategorije", "*", null, null, null, null, null);
$niz=array();
$i=0;
while ($red=$db->getResult()->fetch_object()){
$niz[$i]["id"] = $red->id;
$niz[$i]["kategorija"] = $red->kategorija;
$db_pomocna=new Database("rest");
$db_pomocna->select("novosti", "*", null, null, null,
"novosti.kategorija_id = ".$red->id, null);
while ($red_pomocna=$db_pomocna->getResult()>fetch_object()){
$niz[$i]["novosti"][]=$red_pomocna;
}
$i++;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
12

echo indent($json_niz);
return false;
});

2.8 GET ruta /kategorije/:id.json


Flight::route('GET /kategorije/@id.json', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("kategorije", "*", null, null, null, "kategorije.id =
".$id, null);
$niz=array();
$red=$db->getResult()->fetch_object();
$niz["id"] = $red->id;
$niz["kategorija"] = $red->kategorija;
$db_pomocna=new Database("rest");
$db_pomocna->select("novosti", "*", null, null, null,
"novosti.kategorija_id = ".$red->id, null);
while ($red_pomocna=$db_pomocna->getResult()>fetch_object()){
$niz["novosti"][]=$red_pomocna;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;

});

2.9 POST ruta /novosti


Flight::route('POST /novosti', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
return false;
} else {
if
(!property_exists($podaci,'naslov')||!property_exists($podaci,'tekst')||!pr
operty_exists($podaci,'kategorija_id')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";

13

$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->insert("novosti", "naslov, tekst,
kategorija_id, datumvreme", array($podaci_query["naslov"],
$podaci_query["tekst"], $podaci_query["kategorija_id"], 'NOW()'))){
$odgovor["poruka"] = "Novost je uspeno
ubaena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
ubacivanju novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}
}
);

2.10 POST ruta /kategorije


Flight::route('POST /kategorije', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if (!property_exists($podaci,'kategorija')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
14

$podaci_query[$k] = $v;
}
if ($db->insert("kategorije", "kategorija",
array($podaci_query["kategorija"]))){
$odgovor["poruka"] = "Kategorija je uspeno
ubaena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
ubacivanju novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}

});

2.11 PUT ruta /novosti/:id


Flight::route('PUT /novosti/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if
(!property_exists($podaci,'naslov')||!property_exists($podaci,'tekst')||!pr
operty_exists($podaci,'kategorija_id')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->update("novosti", $id,
array('naslov','tekst','kategorija_id'),array($podaci->naslov, $podaci>tekst,$podaci->kategorija_id))){
$odgovor["poruka"] = "Novost je uspeno
izmenjena";

15

$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
izmeni novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}

});

2.12 PUT ruta /kategorije/:id


Flight::route('PUT /kategorije/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if (!property_exists($podaci,'kategorija')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->update("kategorije", $id,
array('kategorija'),array($podaci->kategorija))){
$odgovor["poruka"] = "Kategorija je uspeno
izmenjena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
izmeni kategorije";
16

$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}
});

2.13 DELETE ruta /novosti/:id


Flight::route('DELETE /novosti/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
if ($db->delete("novosti", array("id"),array($id))){
$odgovor["poruka"] = "Novost je uspeno
izbrisana";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke
prilikom brisanja novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
});

2.14 DELETE ruta /kategorije/:id


Flight::route('DELETE /kategorije/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
if ($db->delete("kategorije", array("id"),array($id))){
$odgovor["poruka"] = "Kategorija je uspeno
izbrisana";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke
prilikom brisanja kategorije";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
17

});

2.15 Kompletna stranica index.php


<?php
require 'flight/Flight.php';
require 'jsonindent.php';
Flight::register('db', 'Database', array('rest'));
$json_podaci = file_get_contents("php://input");
Flight::set('json_podaci', $json_podaci );
Flight::route('/', function(){
echo 'hello world!';
});
Flight::route('GET /novosti.json', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select();
$niz=array();
while ($red=$db->getResult()->fetch_object()){
$niz[] = $red;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;
});
Flight::route('GET /novosti/@id.json', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("novosti", "*", "kategorije", "kategorija_id", "id",
"novosti.id = ".$id, null);
$red=$db->getResult()->fetch_object();
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($red,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;
});
Flight::route('GET /kategorije.json', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("kategorije", "*", null, null, null, null, null);
$niz=array();
$i=0;
while ($red=$db->getResult()->fetch_object()){

18

$niz[$i]["id"] = $red->id;
$niz[$i]["kategorija"] = $red->kategorija;
$db_pomocna=new Database("rest");
$db_pomocna->select("novosti", "*", null, null, null,
"novosti.kategorija_id = ".$red->id, null);
while ($red_pomocna=$db_pomocna->getResult()>fetch_object()){
$niz[$i]["novosti"][]=$red_pomocna;
}
$i++;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;
});
Flight::route('GET /kategorije/@id.json', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$db->select("kategorije", "*", null, null, null, "kategorije.id =
".$id, null);
$niz=array();
$red=$db->getResult()->fetch_object();
$niz["id"] = $red->id;
$niz["kategorija"] = $red->kategorija;
$db_pomocna=new Database("rest");
$db_pomocna->select("novosti", "*", null, null, null,
"novosti.kategorija_id = ".$red->id, null);
while ($red_pomocna=$db_pomocna->getResult()>fetch_object()){
$niz["novosti"][]=$red_pomocna;
}
//JSON_UNESCAPED_UNICODE parametar je uveden u PHP verziji 5.4
//Omoguava Unicode enkodiranje JSON fajla
//Bez ovog parametra, vri se escape Unicode karaktera
//Na primer, slovo e biti \u010
$json_niz = json_encode ($niz,JSON_UNESCAPED_UNICODE);
echo indent($json_niz);
return false;

});
Flight::route('POST /novosti', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
return false;
} else {

19

if
(!property_exists($podaci,'naslov')||!property_exists($podaci,'tekst')||!pr
operty_exists($podaci,'kategorija_id')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->insert("novosti", "naslov, tekst,
kategorija_id, datumvreme", array($podaci_query["naslov"],
$podaci_query["tekst"], $podaci_query["kategorija_id"], 'NOW()'))){
$odgovor["poruka"] = "Novost je uspeno
ubaena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
ubacivanju novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}
}
);
Flight::route('POST /kategorije', function(){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if (!property_exists($podaci,'kategorija')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
20

}
if ($db->insert("kategorije", "kategorija",
array($podaci_query["kategorija"]))){
$odgovor["poruka"] = "Kategorija je uspeno
ubaena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
ubacivanju novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}

});
Flight::route('PUT /novosti/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if
(!property_exists($podaci,'naslov')||!property_exists($podaci,'tekst')||!pr
operty_exists($podaci,'kategorija_id')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->update("novosti", $id,
array('naslov','tekst','kategorija_id'),array($podaci->naslov, $podaci>tekst,$podaci->kategorija_id))){
$odgovor["poruka"] = "Novost je uspeno
izmenjena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
izmeni novosti";
21

$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}

});
Flight::route('PUT /kategorije/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
$podaci_json = Flight::get("json_podaci");
$podaci = json_decode ($podaci_json);
if ($podaci == null){
$odgovor["poruka"] = "Niste prosledili podatke";
$json_odgovor = json_encode ($odgovor);
echo $json_odgovor;
} else {
if (!property_exists($podaci,'kategorija')){
$odgovor["poruka"] = "Niste prosledili korektne
podatke";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$podaci_query = array();
foreach ($podaci as $k=>$v){
$v = "'".$v."'";
$podaci_query[$k] = $v;
}
if ($db->update("kategorije", $id,
array('kategorija'),array($podaci->kategorija))){
$odgovor["poruka"] = "Kategorija je uspeno
izmenjena";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke pri
izmeni kategorije";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
}
}
});
Flight::route('DELETE /novosti/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
if ($db->delete("novosti", array("id"),array($id))){
22

$odgovor["poruka"] = "Novost je uspeno


izbrisana";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke
prilikom brisanja novosti";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}
});
Flight::route('DELETE /kategorije/@id', function($id){
header ("Content-Type: application/json; charset=utf-8");
$db = Flight::db();
if ($db->delete("kategorije", array("id"),array($id))){
$odgovor["poruka"] = "Kategorija je uspeno
izbrisana";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
} else {
$odgovor["poruka"] = "Dolo je do greke
prilikom brisanja kategorije";
$json_odgovor = json_encode
($odgovor,JSON_UNESCAPED_UNICODE);
echo $json_odgovor;
return false;
}

});

Flight::start();
?>

23

3 Kreiranje dokumentacije REST servisa


Iako ne postoji utvren standard za dokumentovanje REST API-ja, u praksi se esto svaki
veb servis detaljno dokumentuje. Dokumentacija bi trebalo da sadri naziv svake funkcije,
opis, ulazne parametre, format ulaznih parametara, format izlaznih parametara i slino.
Za kreiranje sopstvene dokumentacije dobro je rukovoditi se primerima dokumentacija javnih
servisa. Na adresi http://weblog.bocoup.com/documenting-your-api/ postoji dobro uputstvo
za kreiranje dokumentacije.

3.1 Dokumentacija projekta


Root apsolutna putanja do konkretnog projekta je: http://localhost/rest/.
U dokumentaciji se adrese do pojedinih funkcija veb servisa navode u relativnom obliku, u
odnosu na root putanju.
Sledi dokumentacija za sve funkcije servisa.

24

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

Pregled svih novosti


GET
/novosti.json
(nema)
(nema)
(nema)
Niz JSON objekata. Svaki element niza ima
atribute id[int], naslov[string], tekst[string],
datumvreme[datetime], kategorija[string],
kategorija_id[int]
Primer:
[
{

Format izlaznih parametara

"id":"1",
"naslov":"Facebook uveo dislike
za Messenger",
"tekst":"Like dugme postalo je
ikona socijalnih mrea, i
oigledno, Facebooka. Meutim,
postoje trenuci kada je potrebno i
dislike dugme, ali ono nije
postojalao, do sada.",
"datumvreme":"2013-12-18
00:55:38",
"kategorija_id":"1",
"kategorija":"IT"
},
{
"id":"2",
"naslov":"Amazonov telefon
stie 2014?",
"tekst":"Glasine u vezi sa
moguim smartfonom kompanije Amazon
postoje ve neko vreme, ali ini se
da se polako bliimo datumu
predstavljanja.",
"datumvreme":"2013-12-18
00:56:21",
"kategorija_id":"1",
"kategorija":"IT"
}]
application/json

25

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

Pregled odreene novosti


GET
/novosti/:id.json
id [int] - Identifikacioni broj novosti
(nema)
(nema)
JSON objekat sa sledeim atributima: id[int],
naslov[string], tekst[string],
datumvreme[datetime], kategorija[string],
kategorija_id[int]
Primer:
{

Format izlaznih parametara


Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

"id":"1",
"naslov":"Facebook uveo dislike
za Messenger",
"tekst":"Like dugme postalo je
ikona socijalnih mrea, i
oigledno, Facebooka. Meutim,
postoje trenuci kada je potrebno i
dislike dugme, ali ono nije
postojalao, do sada.",
"datumvreme":"2013-12-18
00:55:38",
"kategorija_id":"1",
"kategorija":"IT"
}
application/json
Pregled svih kategorija
GET
/kategorije.json
(nema)
(nema)
(nema)
Niz JSON objekata sa atributima id[int],
kategorija[string], novosti[array of object].
Struktura niza objekata novosti opisana je u
funkciji Pregled svih novosti.
Primer:
{

Format izlaznih parametara

"id":"1",
"naslov":"Facebook uveo dislike
za Messenger",
"tekst":"Like dugme postalo je
ikona socijalnih mrea, i
oigledno, Facebooka. Meutim,
postoje trenuci kada je potrebno i
dislike dugme, ali ono nije
postojalao, do sada.",
"datumvreme":"2013-12-18
00:55:38",
"kategorija_id":"1",
"kategorija":"IT"
}
application/json
26

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

Pregled odreene kategorije


GET
/kategorije/:id
id [int] - Identifikacioni broj kategorije
(nema)
(nema)
JSON objekat sa atributima id[int],
kategorija[string], novosti[array of object].
Struktura niza objekata novosti opisana je u
funkciji Pregled svih novosti.
Primer:
{

Format izlaznih parametara

"id":"1",
"kategorija":"IT",
"novosti":[
{
"id":"1",
"naslov":"Facebook uveo
dislike za Messenger",
"tekst":"Like dugme postalo
je ikona socijalnih mrea, i
oigledno, Facebooka. Meutim,
postoje trenuci kada je potrebno i
dislike dugme, ali ono nije
postojalao, do sada.",
"datumvreme":"2013-12-18
00:55:38",
"kategorija_id":"1"
},
{
"id":"2",
"naslov":"Amazonov telefon
stie 2014?",
"tekst":"Glasine u vezi sa
moguim smartfonom kompanije Amazon
postoje ve neko vreme, ali ini se
da se polako bliimo datumu
predstavljanja.",
"datumvreme":"2013-12-18
00:56:21",
"kategorija_id":"1"
}
]
}
application/json

27

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri

Format HTTP body parametara


Izlazni parametri

Format izlaznih parametara

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri

Format HTTP body parametara


Izlazni parametri

Format izlaznih parametara

Dodavanje novosti
POST
/novosti
(nema)
JSON objekat sa atributima naslov[string],
tekst[string], kategorija_id[int].
Primer:
{
"naslov": "Neki naslov",
"tekst" : "Neki tekst",
"kategorija_id" : 2
}
application/json
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Novost je uspeno
ubaena"
}
application/json

Dodavanje kategorije
POST
/kategorije
(nema)
JSON objekat sa atributom kategorija[string]
Primer:
{
"kategorija" : "Neka kategorija"
}
application/json
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Kategorija je uspeno
ubaena"
}
application/json

28

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri

Format HTTP body parametara


Izlazni parametri

Format izlaznih parametara

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri

Format HTTP body parametara


Izlazni parametri

Format izlaznih parametara

Auriranje novosti
PUT
/novosti/:id
id [int] - Identifikacioni broj novosti
JSON objekat sa atributima naslov[string],
tekst[string], kategorija_id[int].
Primer:
{
"naslov": "Neki naslov",
"tekst" : "Neki tekst",
"kategorija_id" : 2
}
application/json
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Novost je uspeno
izmenjena"
}
application/json

Auriranje kategorije
PUT
/kategorije/:id
id [int] - Identifikacioni broj kategorije
JSON objekat sa atributom kategorija[string]
Primer:
{
"kategorija" : "Neka kategorija"
}
application/json
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Kategorija je uspeno
izmenjena"
}
application/json

29

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

Format izlaznih parametara

Opis funkcije
HTTP metoda
URL
URL parametri
HTTP body parametri
Format HTTP body parametara
Izlazni parametri

Format izlaznih parametara

Brisanje novosti
DELETE
/novosti/:id
id [int] - Identifikacioni broj novosti
(nema)
(nema)
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Novost je uspeno
izbrisana"
}
application/json

Brisanje kategorije
DELETE
/kategorije/:id
id [int] - Identifikacioni broj kategorije
(nema)
(nema)
Kratak JSON objekat sa jednim atributom,
poruka[string].
Primer:
{
"poruka":"Kategorija je uspeno
izbrisana"
}
application/json

30

You might also like