Nella lezione precedente abbiamo ultimato la classe Libro, dando vita al modello che useremo per interagire con il nostro database grazie al paradigma dell'Object-Relational Mapping (ORM). In questa lezione entreremo finalmente nel cuore della guida, iniziando a costruire le nostre API di tipo REST.
|- BibliotecaREST - directory principale di progetto
|--- config/
|------ database.php - effettua la connessione al DB
|--- models/
|------ libro.php - contiene la rappresentazione di un libro della biblioteca
|--- libro/
|------ create.php - crea un libro sul database
|------ delete.php - cancella un libro sul database
|------ read.php - legge i libri dal database
|------ update.php - aggiorna un libro sul database
Come vediamo dalla struttura del progetto, ci rimangono da implementare i file presenti nella directory libro. Questi file, ovvero create.php, delete.php, read.php, update.php, saranno essenziali per eseguire le nostre chiamate REST.
In questa tabella presentiamo un riepilogo di quelle che saranno le chiamate REST che andremo a sviluppare per poter interagire con la nostra Biblioteca. Come vediamo nella tabella, abbiamo il Route, ovvero l'indirizzo con il quale andremo a eseguire la chiamata REST, il metodo HTTP che useremo per tale chiamata, il tipo di ritorno che riceveremo dalla richiesta eseguita e la descrizione della stessa.
Route | Metodo | Tipo | Descrizione |
---|---|---|---|
/BibliotecaREST/libro/read.php | GET |
JSON | Ritorna tutti i libri della nostra biblioteca. |
/BibliotecaREST/libro/create.php | POST |
JSON | Crea un nuovo libro nella nostra biblioteca. |
/BibliotecaREST/libro/update.php | PUT |
JSON | Aggiorna un libro della nostra biblioteca. |
/BibliotecaREST/libro/delete.php | DELETE |
JSON | Cancella un libro dalla nostra biblioteca. |
Read.php
Occupiamoci per prima cosa della chiamata per prelevare dalla nostra biblioteca tutti i libri presenti. Come possiamo vedere dalla tabella precedente, gli elementi base di tale chiamata saranno il metodo HTTP GET
, per eseguire la richiesta, e il metodo read()
appartenente al modello Libro
, creato nelle lezioni precedenti.
Creiamo un nuovo file, chiamato read.php
include_once '../config/database.php';
include_once '../models/libro.php';
$database = new Database();
$db = $database->getConnection();
$libro = new Libro($db);
$stmt = $libro->read();
$num = $stmt->rowCount();
if($num>0){
$libri_arr = array();
$libri_arr["elenco"] = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
extract($row);
$libro_item = array(
"ISBN" => $isbn,
"Titolo" => $titolo,
"Autore" => $autore
);
array_push($libri_arr["elenco"], $libro_item);
}
http_response_code(200);
echo json_encode($libri_arr);
}else{
http_response_code(404);
echo json_encode(
array("message" => "Nessun libro trovato in Biblioteca.")
);
}
Nel codice sopra riportato, quello che facciamo per prima cosa è importare i file database.php
e libro.php
. Questi ci serviranno per poter creare gli oggetti Database
e Libro
. Inizializzeremo l'oggetto Libro
con l'oggetto db
, di tipo Database
, per poter accedere al database della nostra Biblioteca.
Con l'oggetto $libro
siamo in grado di richiamare il suo metodo read()
che si occupa di collegarsi al database della Biblioteca e di eseguire una query SELECT
su di esso. Quello che facciamo successivamente è verificare che il risultato del metodo read()
abbia ricevuto dei risultati (ovvero che dei libri siano stati effettivamente restituiti dalla query SQL). Se dei record sono presenti, allora saranno inseriti in un array PHP chiamato $libri_arr
e ritornati in formato JSON grazie alla conversione data dalla funzione json_encode()
, insieme alla risposta di successo con codice 200 HTTP. In assenza di libri nel database, un messaggio "Nessun libro trovato in Biblioteca" verrà inserito nell'array e una risposta HTTP con codice 404 restituita all'utente.
Per poter testare questa prima API, possiamo servirci del noto plugin Postman per il browser Chrome o del plugin fratello, RESTClient di Firefox.
Dopo ovviamente aver avviato il server Apache con PHP, dovremo semplicemente inserire l'URL seguente nell'interfaccia di uno dei due plugin, in modo da simulare una richiesta REST:
http://localhost/BibliotecaREST/libro/read.php
A questo punto, ci verrà mostrata la lista dei libri (in formato JSON) appartenenti alla Biblioteca.
Create.php
Occupiamoci adesso di scrivere il file create.php
nella stessa directory in cui abbiamo creato file read.php
.
<?php
//headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
include_once '../config/database.php';
include_once '../models/libro.php';
$database = new Database();
$db = $database->getConnection();
$libro = new Libro($db);
$data = json_decode(file_get_contents("php://input"));
if(
!empty($data->ISBN) &&
!empty($data->Titolo) &&
!empty($data->Autore)
){
$libro->ISBN = $data->ISBN;
$libro->Titolo = $data->Titolo;
$libro->Autore = $data->Autore;
if($libro->create()){
http_response_code(201);
echo json_encode(array("message" => "Libro creato correttamente."));
}
else{
//503 servizio non disponibile
http_response_code(503);
echo json_encode(array("message" => "Impossibile creare il libro."));
}
}
else{
//400 bad request
http_response_code(400);
echo json_encode(array("message" => "Impossibile creare il libro i dati sono incompleti."));
}
?>
La richiesta per la creazione di un nuovo Libro nella Biblioteca è un po' più elaborata rispetto a quella precedente. Come vediamo all'inizio del codice sopra riportato, per prima cosa dobbiamo creare l'header di richiesta HTTP. Notiamo che per questa richiesta specifichiamo come metodo HTTP quello POST
, cosa che non abbiamo fatto nel codice del file read.php
. Infatti, se riprendiamo la tabella all'inizio di questa lezione, vediamo che la richiesta di lettura dati necessita del metodo HTTP GET
e che quella di creazione del metodo POST
. In read.php
non abbiamo avuto la necessità di specificare il tipo di metodo HTTP perchè una richiesta HTTP è già di default considerata come GET
.
Specificato ciò, le funzioni di questo codice che meritano di essere maggiormente attenzionate sono la json_decode
e la file_get_contents
.
La prima, come si intuisce dal nome, riceve una stringa codificata in formato JSON e la converte in una variabile PHP; la seconda, invece, permette di recuperare il contenuto da file locali o URL tradizionali e memorizzarli in una stringa. Quindi, entrambe queste funzioni leggono dati JSON e li salvano in una variabile PHP.
L'uso del metodo HTTP POST, nel caso del'API create.php
non è casuale. Una richiesta POST viene infatti utilizzata quando si ha la necessità di inviare al server alcune informazioni aggiuntive all'interno del suo body.
Le informazioni aggiuntive da inviare al nostro server saranno, ovviamente, i dati del libro che vorremmo inserire.
Il codice esegue infine dei controlli su i dati immessi nel body della richiesta, controllando se sono completi o se non è possibile inserirli nel database (magari perchè un duplicato è già presente).
Per testare il codice, utilizziamo nuovamente Postman. In ordine, dovremo:
- impostare il metodo HTTP POST
- immettere l'URL della richiesta
- selezionare il body per immettere i dati del libro
- selezionare raw
- inserire il JSON seguente:
{ "ISBN" : "00000020dd02", "Titolo" : "Kafka sulla spiaggia", "Autore" : "Murakami Haruki", }
Se tutto è andato per il meglio, verrà mostrato un messaggio di buona riuscita con codice 200.
Nella prossima lezione tratteremo le richieste update e delete.