Una volta compreso in che modo connetterci al database e come modellare i dati, in questa lezione scriveremo il nostro primo servizio. Esso ci permetterà di richiedere tutti i libri presenti all'interno della nostra biblioteca.
Il codice seguente è quello che includeremo all'interno della pagina read.php:
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
// includiamo database.php e libro.php per poterli usare
include_once '../config/database.php';
include_once '../models/libro.php';
// creiamo un nuovo oggetto Database e ci colleghiamo al nostro database
$database = new Database();
$db = $database->getConnection();
// Creiamo un nuovo oggetto Libro
$libro = new Libro($db);
// query products
$stmt = $libro->read();
$num = $stmt->rowCount();
// se vengono trovati libri nel database
if($num>0){
// array di libri
$libri_arr = array();
$libri_arr["records"] = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
extract($row);
$libro_item = array(
"ISBN" => $ISBN,
"Autore" => $autore,
"Titolo" => $titolo
);
array_push($libri_arr["records"], $libro_item);
}
echo json_encode($libri_arr);
}else{
echo json_encode(
array("message" => "Nessun Libro Trovato.")
);
}
?>
Analizzando il codice, vediamo che le prime due due righe sfruttano la funzione header()
di PHP per specificare gli header HTTP della risposta. In particolare, queste due istruzioni si occupano di rendere accessibile la pagina read.php a qualsiasi dominio, e di restituire un contenuto di tipo JSON, codificato in UTF-8. Questo significa che i dati che preleveremo dal nostro database (ovvero i libri della biblioteca) saranno codificati in formato JSON prima di essere restituiti al client che ha richiesto il servizio.
Dopo la dichiarazione degli header, includiamo i file database.php e libro.php per poter adoperare le classi Database e Libro che abbiamo definito nei rispettivi file. Creiamo quindi un oggetto Database
ed instauriamo il collegamento con il nostro database mediante la funzione getConnection()
.
A questo punto potremo passare la connessione con il database al costruttore della classe Libro, e di chiamare finalmente la sua funzione read()
, che eseguirà la query SQL che abbiamo scritto in precedenza.
Se vengono trovati dei libri, essi vengono salvati uno ad uno in un array PHP, per essere successivamente codificati in formato JSON grazie alla funzione json_encode()
, e ritornati al client.
Output del servizio
Per poter adoperare o testare il servizio appena creato, basta raggiungere l'indirizzo http://localhost/BibliotecaREST/libro/read.php con un semplice browser web o mediante una chiamata HTTP GET
in un qualsiasi linguaggio di programmazione. La richiesta sarà gestita eseguendo le istruzioni PHP contenute nel file read.php, con relativa connessione al database e creazione di un oggetto di tipo Libro, che eseguirà la ricerca dei libri nel database.
L'output sarà simile al seguente:
{
"records": [
{
"ISBN": "A1111",
"Autore": "Herman Melville",
"Titolo": "Moby Dick"
},
{
"ISBN": "A2222",
"Autore": "Alexandre Dumas",
"Titolo": "Il conte di Montecristo"
},
{
"ISBN": "A3333",
"Autore": "Omero",
"Titolo": "Odissea"
}
}
La bellezza dei servizi REST consta nel fatto che qualsiasi tipo di client potrà
richiamare lo stesso identico servizio, semplicemente inviando una
richiesta HTTP all'URL sopra definito, senza doverlo reimplementare
nello stesso linguaggio con il quale è stato sviluppato il client.
Per questo motivo, i servizi REST rappresentano una valida risorsa progettuale per
tagliare i costi di sviluppo ed uniformare la comunicazione tra più client mediante gli stessi
servizi.
Considerando l'esempio della biblioteca visto finora, si potrebbe pensare
di realizzare senza grosse difficoltà sia una applicazione desktop che una
mobile, adoperando gli stessi identici servizi REST per l'accesso e la
modifica dei dati. Si dovrebbe infatti adoperare una chiamata HTTP GET
per
ottenere i dati dei libri presenti nella biblioteca.
Nelle prossime lezioni vedremo come realizzare i servizi create()
, update()
e delete()
, mappandoli sui metodi HTTP POST, PUT e DELETE.