Upload
lamlien
View
214
Download
0
Embed Size (px)
Citation preview
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
1
MOBILNE TEHNOLOGIJE I PROGRAMIRANJE –
MTIPLAB02
Vežba 2 – PHP RESTfull Servis, JSON Serijalizacija objekata, Interfejsi,
Parcijalna MySQL Injection zaštita, filtriranje korisničkog unosa
UVOD
U okviru ove vežbe, formiraće se PHP RESTfull Servis koji koristi usluge DAL (Data Access Layer),
formira objekte, serijalizuje ih u JSON format (JavaScript Object Notation) i šalje na front-end
(korisničkom interfejsu). Cilj ove vežbe jeste da se PDO (PHP Database Objects) upiti tj. operacije
smeste u DAL (Data Access / Abstraction Layer), da se svaka tabela predstavi odgovarajućim
objektom (entitetom). Za svaki entitet baze podataka napisaće se odgovarajuća klasa i DAL za
istu. DAL bilo koje klase nasleđivaće bazni (osnovni) DAL implementiraće odgovarajuće interfejse
i opsluživaće samo objekte odgovarajuće klase. Na osnovu gore izloženog da se zaključiti ta će se
objekti koristiti samo kao odgovarajući kontejneri / memorijske strukture određenih objekata,
dok će ceo posao obavljati upravo DAL tog objekta.
DAL ZA PHP RESTFULL SERVIS
Imajući u vidu gore navedeno bazna DAL klasa će nasleđivati klasu dbSettings u kojoj će se nalaziti
konfiguracija konekcije baze podataka. Alternativno konfiguracija konekcije do baze podataka se
može čitati iz XML fajla.
class dbSettings { protected $_dbserver=""; protected $_dbuser=""; protected $_dbpassword=""; protected $_database=""; public function __construct($path) { $xmlstr = file_get_contents($path); $configurations = new SimpleXMLElement($xmlstr); $this->_dbserver = $configurations->database[0]->server; $this->_dbuser = $configurations->database[0]->user; $this->_dbpassword = $configurations->database[0]->password; $this->_database = $configurations->database[0]->databasename; }
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
2
function get_dbserver() { return $this->_dbserver; } function get_dbuser() { return $this->_dbuser; } function get_dbpassword() { return $this->_dbpassword; } function get_database() { return $this->_database; } function set_dbserver($_dbserver) { $this->_dbserver = $_dbserver; } function set_dbuser($_dbuser) { $this->_dbuser = $_dbuser; } function set_dbpassword($_dbpassword) { $this->_dbpassword = $_dbpassword; } function set_database($_database) { $this->_database = $_database; } }
Listing broj 1. dbsettings.php fajl
<?xml version="1.0" standalone="yes"?> <configurations> <database> <server>localhost</server> <user>mtip_korisnik2017</user> <password>12345</password> <databasename>mtip2017</databasename> </database> </configurations>
Listing broj 2. conrigurations.xml fajl
Bazna DAL klasa će posedovati metode putem kojih se uspostavlja i prekida konekcija sa bazom
podataka i izvršava bilo koji PDO upit. PDO upiti se koriste kako bi se izvršavali parametarski
upiti, stored procedure i dr. Upiti koji se formiraju konkatanacijom stringova treba izbegavati
pošto su podložni SQL Injection napadima. Zatim, biće napisana još jedna klasa koja će
predsavljati generički skup podataka, zasnovan na asocijativnim nizovima podataka, a sličan
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
3
DataSet strukturi iz ADO.NET okruženja. Klasa DALRezultatUpita sadrži asocijativni niz i
preklopljene __set i __get metode koje za odgovarajući ključ (naziv promenljive) unutar niza
rezultati čitaju ili dodeljuju odgovarajuću vrednost.
Navedena struktura nazvana je DALRezultatUpita dok listing iste sledi.
class DALRezultatUpita { protected $_rezultati = array(); public function __construct(){} public function __set($kljuc,$vrednost){ $this->_rezultati[$kljuc] = $vrednost; } public function __get($kljuc){ if (isset($this->_rezultati[$kljuc])){ return $this->_rezultati[$kljuc]; } else{ return null; } } }
Listing broj 3. DALRezultatUpita
Listing bazne DAL klase prikazan je u sledećem segmentu.
require_once '../lib/DAL/DALRezultatUpita.php'; require_once '../lib/utility/dbsettings.php'; class DAL { protected $_konekcija; protected $_naredba; protected $_podesavanjaBaze; public function __construct() { $this->_podesavanjaBaze = new dbSettings('../configurations.xml'); } protected function UspostaviKonekcijuSaBazom() { try { $this->_konekcija = new PDO("mysql:host=".$this->_podesavanjaBaze->get_dbserver().";dbname=".$this->_podesavanjaBaze->get_database(), $this->_podesavanjaBaze->get_dbuser(), $this->_podesavanjaBaze->get_dbpassword(),
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
4
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); $this->_konekcija->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { die ("Neuspesna konekcija ka serveru baze podataka..."); } return $this->_konekcija; } protected function PrekiniKonekcijuSaBazom() { $this->_naredba = null; $this->_konekcija = null; } protected function IzvrsiUpit($sqlUpit, $params) { $this->UspostaviKonekcijuSaBazom(); $this->_naredba = $this->_konekcija->prepare($sqlUpit); if (count($params)>0) { $keys = array_keys($params); foreach($params as $key => $value) $this->_naredba->bindValue($key, $value); } $rezultatUpita = $this->_naredba->execute(); if ($rezultatUpita){ if (strpos($sqlUpit,'SELECT') === false){ return true; } } else{ if (strpos($sqlUpit,'SELECT') === false){ return false; } else{ return null; } } $rezultati = array();
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
5
while ($red = $this->_naredba->fetch()){ $rezultatUpitaDAL = new DALRezultatUpita(); foreach ($red as $kljuc=>$vrednost){ $rezultatUpitaDAL->$kljuc = $vrednost; } $rezultati[] = $rezultatUpitaDAL; } $this->PrekiniKonekcijuSaBazom(); return $rezultati; } }
Listing broj 4. DAL klasa
Listing interfejsa CommonDatabaseMethods i FieldValidator dat je u prilogu.
interface FieldValidator { public function ValidateFields(); } interface CommonDatabaseMethods { function AddOne($object); function EditOne($object); function DeleteOne($object); function GetOne($object); function GetAll(); }
Listing broj 5. Interfejsi FieldValidator i CommonDatabaseMethods
Svaki student opisan je putem 5 polja: : idStudent, Prezime, Ime, Indeks i idSemera. Prema tome,
objekat koji opisuje entitet tabele Student treba ta ima odgovarajuću strukturu koja se slaže sa
strukturom bate podataka. Klasa Student napisana je kako bi objekat navedene klase adekvatno
predstavio entitet Student koji je smešten (opisan) unutar jednog reda tabele Student. Klasa
Student treba da poseduje objekat klase Smer, ali pošto je PHP slabo tipizirani jezik, navedeno se
ne naznačava. Listing klase Student sledi.
<?php require_once 'Smer.php'; class Student implements JsonSerializable, FieldValidator { protected $_idStudent = 0; protected $_ime = ""; protected $_prezime = ""; protected $_index = ""; protected $_smer;
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
6
function __construct() { } function get_idStudent() { return $this->_idStudent; } function get_ime() { return $this->_ime; } function get_prezime() { return $this->_prezime; } function get_index() { return $this->_index; } function get_smer() { return $this->_smer; } function set_idStudent($_idStudent) { $this->_idStudent = $_idStudent; } function set_ime($_ime) { $this->_ime = $_ime; } function set_prezime($_prezime) { $this->_prezime = $_prezime; } function set_smer($_smer) { $this->_smer = $_smer; } function set_index($_index) { $this->_index = $_index; } public function jsonSerialize() { return (object) get_object_vars($this); } public function jsonDeserialize($data) {
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
7
$this->_idStudent = $data->{'_idStudent'}; $this->_ime= $data->{'_ime'}; $this->_prezime = $data->{'_prezime'}; $this->_index = $data->{'_index'}; $smer = new Smer(); $smer->jsonDeserialize($data->{'_smer'}); $this->_smer = $smer; } public function ValidateFields() { $this->_idStudent = formatInput($this->_idStudent); $this->_ime= formatInput($this->_ime); $this->_prezime = formatInput($this->_prezime); $this->_index = formatInput($this->_index); if ($this->_smer!=NULL) $this->_smer->ValidateFields(); } }
Listing broj 6. Listing klase Student
Klasa StudentDAL nasleđuje klasu DAL, implementira interfejs CommonDatabaseMethods i
realizuje sve potrebne metode za manipulaciju objektima entitetima tipa Student. Konkretno to
su metode za dodavanje, izmenu i brisanje entiteta tipa Student, kao i za prikaz svih i pojedinih
entiteta. Metode za dodavanje, izmenu i brisanje entiteta tipa Student primaju objekat tipa
Student koji predstavlja određeni entitet iz tabele Student. Klasa Student implementira interfejs
JsonSerializable i metode za serijalizaciju, odnosno deserijalizaciju JSON objekta.
<?php require_once '../lib/DAL/DAL.php'; require_once '../lib/class/Student.php'; require_once '../lib/DAL/SmerDAL.php'; class StudentDAL extends DAL implements CommonDatabaseMethods { function __construct() { parent::__construct(); } function PrikaziStudentePretraga($search) { $tempStud = new Student(); $tempStud->set_prezime($search); $tempStud->ValidateFields(); $sqlQuery="SELECT * FROM Student WHERE Prezime LIKE :prezime"; $params = array(":prezime"=>"%".$tempStud->get_prezime()."%"); $results = $this->IzvrsiUpit($sqlQuery, $params);
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
8
$studResults = array(); foreach ($results as $k) { $studResult = new Student(); $studResult->set_idStudent($k->idStudent); $studResult->set_prezime($k->Prezime); $studResult->set_ime($k->Ime); $studResult->set_index($k->Indeks); $smerDAL = new SmerDAL(); $studResult->set_smer($smerDAL->GetOne($k->idSmer)); $studResults[] = $studResult; } return $studResults; } public function AddOne($object) { $object->ValidateFields(); $sqlQuery="INSERT INTO Student(Ime, Prezime, Indeks, idSmer) VALUES(:Ime, :Prezime, :Indeks, :idSmer)"; $params = array(":Ime"=>$object->get_ime(), ":Prezime" =>$object->get_prezime(), ":Indeks"=>$object->get_index(), ":idSmer"=>$object->get_smer()->get_idSmer()); return $this->IzvrsiUpit($sqlQuery, $params); } public function DeleteOne($object) { $object->ValidateFields(); $sqlQuery="DELETE FROM Student WHERE idStudent = :idStudent"; $params = array(":idStudent"=>$object->get_idStudent()); return $this->IzvrsiUpit($sqlQuery, $params); } public function EditOne($object) { $object->ValidateFields(); $sqlQuery="UPDATE Student SET Ime = :Ime, Prezime = :Prezime, Indeks = :Indeks, idSmer = :idSmer WHERE idStudent = :idStudent"; $params = array(":Ime"=>$object->get_ime(), ":Prezime" =>$object->get_prezime(), ":Indeks"=>$object->get_index(), ":idSmer"=>$object->get_smer()->get_idSmer(), ":idStudent"=>$object->get_idStudent()); return $results = $this->IzvrsiUpit($sqlQuery, $params);
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
9
} public function GetAll() { $sqlQuery="SELECT * FROM Student"; $params = array(); $results = $this->IzvrsiUpit($sqlQuery,$params); $studResults = array(); foreach ($results as $k) { $studResult = new Student(); $studResult->set_idStudent($k->idStudent); $studResult->set_prezime($k->Prezime); $studResult->set_ime($k->Ime); $studResult->set_index($k->Indeks); $smerDAL = new SmerDAL(); $studResult->set_smer($smerDAL->GetOne($k->idSmer)); $studResults[] = $studResult; } return $studResults; } public function GetOne($object) { $studResult = new Student(); $studResult->set_idStudent($object); $sqlQuery="SELECT * FROM Student WHERE idStudent = :idStudent"; $params = array(":idStudent" =>$studResult->get_idStudent()); $results = $this->IzvrsiUpit($sqlQuery,$params); if (count($results)>0) { $k = $results[0]; $studResult = new Student(); $studResult->set_idStudent($k->idStudent); $studResult->set_prezime($k->Prezime); $studResult->set_ime($k->Ime); $studResult->set_index($k->Indeks); $smerDAL = new SmerDAL(); $studResult->set_smer($smerDAL->GetOne($k->idSmer)); } return $studResult; }
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
10
} ?>
Listing broj 7. Klasa StudentDAL
Klasa Smer i njena odgovarajuća DAL klasa (SmerDAL) slede u nastavku.
<?php require_once 'InterfaceFieldValidator.php'; require_once 'inputFormaterCustom.php'; class Smer implements JsonSerializable, FieldValidator { protected $_idSmer = 0; protected $_nazivSmera = ""; protected $_sifra = ""; function get_idSmer() { return $this->_idSmer; } function get_nazivSmera() { return $this->_nazivSmera; } function get_sifra() { return $this->_sifra; } function set_idSmer($_idSmer) { $this->_idSmer = $_idSmer; } function set_nazivSmera($_nazivSmera) { $this->_nazivSmera = $_nazivSmera; } function set_sifra($_sifra) { $this->_sifra = $_sifra; } function __construct() { } public function jsonSerialize() { return (object) get_object_vars($this); }
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
11
public function jsonDeserialize($data) { $this->_idSmer = $data->{'_idSmer'}; $this->nazivSmera = $data->{'_nazivSmera'}; $this->sifra = $data->{'_sifra'}; } public function ValidateFields() { $this->_idSmer = formatInput($this->_idSmer); $this->_nazivSmera = formatInput($this->_nazivSmera); $this->_sifra = formatInput($this->_sifra); } }
Listing broj 8. Klasa Smer
Svaka klasa poseduje metode (funkcije) koje serijalizuju, odnosno deserijalizuju objekat u JSON
format. O samoj strukturi JSON formata više informacija pruža stranica
http://php.net/manual/en/book.json.php
<?php require_once '../lib/DAL/DAL.php'; require_once '../lib/class/Smer.php'; require_once '../lib/DAL/CommonDatabaseMethods.php'; class SmerDAL extends DAL implements CommonDatabaseMethods { function __construct() { parent::__construct(); } public function AddOne($object) { $object->ValidateFields(); $sqlQuery = "INSERT INTO SMER (nazivSmera, sifra) VALUES (:nazivSmera, :sifra)"; $params = array(":nazivSmera"=>$object->get_nazivSmera(),":sifra"=>$object->get_sifra()); return $this->IzvrsiUpit($sqlQuery, $params); } public function EditOne($object) { $object->ValidateFields();
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
12
$sqlQuery = "UPDATE SMER SET nazivSmera = :nazivSmera, sifra = :sifra WHERE idSmer = :idSmer"; $params = array(":nazivSmera"=>$object->get_nazivSmera(), ":sifra"=>$object->get_sifra(), ":idSmer"=>$object->get_idSmer()); return $this->IzvrsiUpit($sqlQuery, $params); } public function DeleteOne($object) { $object->ValidateFields(); $sqlQuery = "DELETE FROM SMER WHERE idSmer = :idSmer"; $params = array(":idSmer"=>$object->get_idSmer()); return $this->IzvrsiUpit($sqlQuery, $params); } public function GetAll() { $sqlQuery = "SELECT * FROM SMER"; $params = array(); $results = $this->IzvrsiUpit($sqlQuery, $params); $smerResults = array(); foreach ($results as $k) { $smer = new Smer(); $smer->set_idSmer($k->idSmer); $smer->set_nazivSmera($k->nazivsmera); $smer->set_sifra($k->sifra); $smerResults[] = $smer; } return $smerResults; } public function GetOne($object) { $smerResult = new Smer(); $smerResult->set_idSmer($object); $smerResult->ValidateFields(); $sqlQuery = "SELECT * FROM SMER WHERE idSmer = :idSmer"; $params = array(":idSmer"=>$smerResult->get_idSmer()); $results = $this->IzvrsiUpit($sqlQuery, $params); if (count($results)>0) {
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
13
$k = $results[0]; $smerResult->set_idSmer($k->idSmer); $smerResult->set_nazivSmera($k->nazivsmera); $smerResult->set_sifra($k->sifra); } return $smerResult; } }
Listing broj 9. Klasa SmerDAL
function formatInput($input) { $formatedInput = $input; // html tags $formatedInput = strip_tags($formatedInput); // javascript $formatedInput = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $formatedInput); // mysql injection $formatedInput = mysql_escape_mimic($formatedInput); return $formatedInput; } function mysql_escape_mimic($inp) { if (is_array($inp)) return array_map(__METHOD__, $inp); if (!empty($inp) && is_string($inp)) { return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a", ';', '%', '_'), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z', '', '', ''), $inp); } return $inp; }
Listing broj 10. Sadržaj fajla inputFormaterCustom.php i funkcije formatInput i
mysql_escape_mimic
IMPLEMENTACIJA RESTFULL SERVISA
RESTFull servis se sastoji iz 3 fajla. Prvi fajl je .htaccess putem kojih obavlja preusmeravanje
poziva i poziv funkcija RESTFull servisa
<IfModule mod_rewrite.c> RewriteEngine On
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
14
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-s RewriteRule ^(.*)$ api.php?x=$1 [QSA,NC,L] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.*)$ api.php [QSA,NC,L] RewriteCond %{REQUEST_FILENAME} -s RewriteRule ^(.*)$ api.php [QSA,NC,L] </IfModule>
Listing broj 11. .htaccess
Drugi fajl je Rest.php. Unutar navedenog fajla nalazi se osnovna implementacija REST servisa
class REST { public $_allow = array(); public $_content_type = "application/json"; public $_request = array(); private $_method = ""; private $_code = 200; public function __construct(){ $this->inputs(); } public function get_referer(){ return $_SERVER['HTTP_REFERER']; } public function response($data,$status){ $this->_code = ($status)?$status:200; $this->set_headers(); echo $data; exit; } private function get_status_message(){ $status = array( 200 => 'OK', 201 => 'Created', 204 => 'No Content', 404 => 'Not Found', 406 => 'Not Acceptable'); return ($status[$this->_code])?$status[$this->_code]:$status[500]; } public function get_request_method(){ return $_SERVER['REQUEST_METHOD']; } private function inputs(){ switch($this->get_request_method()){
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
15
case "POST": $this->_request = $this->cleanInputs($_POST); break; case "GET": case "DELETE": $this->_request = $this->cleanInputs($_GET); break; case "PUT": parse_str(file_get_contents("php://input"),$this->_request); $this->_request = $this->cleanInputs($this->_request); break; default: $this->response('',406); break; } } private function cleanInputs($data){ $clean_input = array(); if(is_array($data)){ foreach($data as $k => $v){ $clean_input[$k] = $this->cleanInputs($v); } }else{ if(get_magic_quotes_gpc()){ $data = trim(stripslashes($data)); } $data = strip_tags($data); $clean_input = trim($data); } return $clean_input; } private function set_headers(){ header("HTTP/1.1 ".$this->_code." ".$this->get_status_message()); header("Content-Type:".$this->_content_type); } }
Listing broj 11. Rest.php
Sledeći fajl poseduje naziv api.php i unutar istog je definisano ponašanje (metode / funkcije)
RESTfull servisa
<?php require_once "Rest.php" ; require_once '../lib/DAL/SmerDAL.php'; require_once '../lib/DAL/StudentDAL.php'; class API extends REST {
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
16
public function __construct() { parent::__construct(); } public function processApi() { $func = strtolower(trim(str_replace("/", "", $_REQUEST['x']))); if ((int) method_exists($this, $func) > 0) $this->$func(); else $this->response('false', 404); } public function json($data) { if (is_array($data)) { return json_encode($data); } } private function studenti() { if ($this->get_request_method() != "GET") $this->response('false', 406); $studentiDAL = new StudentDAL(); $studenti = $studentiDAL->GetAll(); $this->response($this->json($studenti), 200); } private function studentipretraga() { if ($this->get_request_method() != "GET") $this->response('false', 406); $search = (string) $this->_request['search']; $studentiDAL = new StudentDAL(); $studenti = $studentiDAL->PrikaziStudentePretraga($search); $this->response($this->json($studenti), 200); } private function student() { if ($this->get_request_method() != "GET") { $this->response('false', 406); } $idStudent = (int) $this->_request['idStudent']; if ($idStudent > 0) { $studentDAL = new StudentDAL(); $student = $studentDAL->GetOne($idStudent); $result = array(); array_push($result, $student);
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
17
$this->response($this->json($result), 200); } $this->response('false', 204); } private function dodajstudenta() { if ($this->get_request_method() != "POST") { $this->response('false', 406); } $student = new Student(); $student->set_ime((string) $this->_request['Ime']); $student->set_prezime((string) $this->_request['Prezime']); $student->set_index((string) $this->_request['Indeks']); $smerDAL = new SmerDAL(); $student->set_smer($smerDAL->GetOne((int) $this->_request['idSmer'])); $studentDAL = new StudentDAL(); $succ = $studentDAL->AddOne($student); if (!$succ) $this->response('false', 204); else $this->response('true', 200); } private function izmenistudenta() { if ($this->get_request_method() != "POST") { $this->response('false', 406); } $student = new Student(); $student->set_idStudent((int) $this->_request['id']); $student->set_ime((string) $this->_request['Ime']); $student->set_prezime((string) $this->_request['Prezime']); $student->set_index((string) $this->_request['Indeks']); $smerDAL = new SmerDAL(); $student->set_smer($smerDAL->GetOne((int) $this->_request['idSmer'])); $studentDAL = new StudentDAL(); $succ = $studentDAL->EditOne($student); if (!$succ) $this->response('false', 204); else $this->response('true', 200); } private function obrisistudenta() { if ($this->get_request_method() != "POST") { $this->response('false', 406); } $student = new Student(); $student->set_idStudent((int) $this->_request['id']); $studentDAL = new StudentDAL(); $succ = $studentDAL->DeleteOne($student);
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
18
if (!$succ) $this->response('false', 204); else $this->response('true', 200); } private function smerovi() { if ($this->get_request_method() != "GET") $this->response('false', 406); $smerDAL = new SmerDAL(); $smerArr = $smerDAL->GetAll(); $this->response($this->json($smerArr), 200); } private function smer() { if ($this->get_request_method() != "GET") { $this->response('false', 406); } $idSmer = (int) $this->_request['idSmer']; if ($idSmer > 0) { $smerDAL = new SmerDAL(); $smer = $smerDAL->GetOne($idSmer); $result = array(); array_push($result, $smer); $this->response($this->json($result), 200); } $this->response('false', 204); } } $api = new API; $api->processApi(); ?>
Listing broj 12. api.php
Unutar REST servisa nalazi se skup funkcija koje se mogu pozvati putem HTTP protokola po
nazivu same funkcije. Funkcije koje se pozivaju po GET metodi vraćaju podatke (nizove objekata)
u JSON formatu, dok se funkcije koje se pozivaju po POST metodi uglavnom koriste za dodavanje,
brisanje ili izmenu podataka.
Na primer, funkcija studenti se poziva putem browsera pozivom
http://localhost/mtip/services/studenti
private function studenti() { if ($this->get_request_method() != "GET") $this->response('false', 406); $studentiDAL = new StudentDAL(); $studenti = $studentiDAL->GetAll(); $this->response($this->json($studenti), 200); }
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
19
Unutar iste proverava se da li je ista pozvana putem GET metode, i ako nije vraća se odgovarajući
HTML odgovor sa statusnim kodom 406. U suprotnom, ukoliko je funkcija pozvana putem GET
metode kreira se instanca objekta StudentDAL() i preuzima se niz objekata tipa Student. Zatim se
kao odgovor navedene funkcije pozivom funkcije json navedeni niz objekata serijalizuje u JSON
formatu kao niz objekata sledeće sadržine.
[{"_idStudent":"1","_ime":"Ivana","_prezime":"\u017digic","_index":"34\/0
5-08","_smer":{"_idSmer":"4","_nazivSmera":"In\u017eenjerski
menad\u017ement","_sifra":"IM"}},{"_idStudent":"2","_ime":"Aleksandar","_
prezime":"Reza\u010d","_index":"47\/05-
11","_smer":{"_idSmer":"1","_nazivSmera":"Informacione tehnologije -
In\u017eenjerstvo","_sifra":"IT"}},{"_idStudent":"3","_ime":"Zlatibor","_
prezime":"Veljkovi\u0107","_index":"106\/04-
11","_smer":{"_idSmer":"1","_nazivSmera":"Informacione tehnologije -
In\u017eenjerstvo","_sifra":"IT"}},{"_idStudent":"4","_ime":"Petar","_pre
zime":"Bo\u017eovic","_index":"66\/05-
10","_smer":{"_idSmer":"3","_nazivSmera":"Informacione tehnologije - U
obrazovanju","_sifra":"IT"}},{"_idStudent":"5","_ime":"Aleksandra","_prez
ime":"Mihi\u0107","_index":"146\/04-
11","_smer":{"_idSmer":"4","_nazivSmera":"In\u017eenjerski
menad\u017ement","_sifra":"IM"}},{"_idStudent":"6","_ime":"Jelena","_prez
ime":"Tasi\u0107","_index":"17\/05-
11","_smer":{"_idSmer":"3","_nazivSmera":"Informacione tehnologije - U
obrazovanju","_sifra":"IT"}},{"_idStudent":"7","_ime":"Predrag","_prezime
":"Pecev","_index":"41\/03-
11","_smer":{"_idSmer":"1","_nazivSmera":"Informacione tehnologije -
In\u017eenjerstvo","_sifra":"IT"}}]
Funkcije koje se pozivaju putem POST metoda, funkcionišu na sličan način kao i funkcije koje se
pozivaju putem GET metode osim što ne vraćaju serijalizovane JSON objekte, već putem POST
mehanizma preuzimaju odgovarajuće parametre, formiraju odgovarajuće objekte na osnovu
preuzetih vrednosti, formiraju odgovarajuće DAL objekte i dodaju, menjaju ili brišu formirane
objekte.
private function dodajstudenta() { if ($this->get_request_method() != "POST") { $this->response('false', 406); }
dr Predrag Pecev – Mobilne tehnologije i programiranje – Vežbe 2017 – 2018 – R2-
Podložno izmeni - Nerecenzirani materijal
20
$student = new Student(); $student->set_ime((string) $this->_request['Ime']); $student->set_prezime((string) $this->_request['Prezime']); $student->set_index((string) $this->_request['Indeks']); $smerDAL = new SmerDAL(); $student->set_smer($smerDAL->GetOne((int) $this->_request['idSmer'])); $studentDAL = new StudentDAL(); $succ = $studentDAL->AddOne($student); if (!$succ) $this->response('false', 204); else $this->response('true', 200); }
ZADACI ZA DOMAĆI
1. Replicirati primer iz ove vežbe.
2. Implementirati RESTfull servis koji treba da opslužuje bazu na temu X. Podsetnik: Za X
(X = brIndeksa % 10) teme su sledeće:
0. Baza knjiga
1. Baza auto delova
2. Baza nameštaja
3. Baza kompjuterskih programa
4. Baza recepata
5. Baza mobilnih telefona
6. Baza studijskih smerova
7. Baza studijskih predmeta
8. Baza profesora fakulteta
9. Baza asistenata fakulteta