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

MTIPLab02 - 2017 - 2018 - tfzr.uns.ac.rs - PDF - R2.pdfBazna DAL klasa će posedovati metode putem kojih se uspostavlja i prekida konekcija sa bazom podataka i izvršava bilo koji

  • 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