Domanda su servizi RESTful

LowSlow

Utente Attivo
419
13
CPU
Intel Core i7 8700 3,2 GHz Coffee lake
Dissipatore
Arctic Cooling Freezer 11 LP
Scheda Madre
Gigabyte Z370P D3
HDD
Adata SSD XPG SX6000 M.2 512 GB - Seagate 500 GB Sata 3 7200 rpm - Samsung 320 GB SATA2 7200rpm
RAM
G.skill Aegis 16 GB DDR4 2400 Mhz
GPU
Gigabyte Nvidia GeForce GTX 960 2 GB
Audio
Integrata
Monitor
Samsung SyncMaster EX2220 22" FullHD LED
PSU
Cooler Master 600w
Case
Cooler Master Elite 430 Black
OS
Windows 10
Per un progetto universitario sto creando una web application in angularjs che comunica con un database mysql, il professore ha richiesto che la comunicazione deve avvenire tramite un servizio RESTful. Senza informarmi troppo sulla teoria dei servizi RESTful ho creato temporaneamente questa architettura: se per esempio voglio prendere tutti gli utenti presenti nella tabella "users" del database, ho creato un file php (l'ho chiamato getUsers.php) che si collega al database, fa una select su tutta la tabella "users" e torna tutte le row come oggetto json, dalla web application angular faccio un get (http) su questo file "getUsers.php" e mi arrivano gli oggetti json con i dati di tutti gli utenti (username, password ecc.). Oppure, per esempio, se voglio aggiungere un utente nella tabella "users" del db, ho creato un file php (che ho chiamato addUser.php) che si collega al database, fa una insert nella tabella "users" e come dati per l'utente mette quelli che arrivano nella variabile $_POST, di conseguenza dalla web application angular, quando voglio aggiungere un utente, faccio una chiamata post (http) al file "addUser.php" e gli passo i dati dell'utente che voglio caricare.
Quello che volevo chiedere è: questo tipo di "architettura" può definirsi un servizio RESTful o devo modificarla?
Grazie.
 

pabloski

Utente Èlite
2,868
916
Si, quanto hai scritto è una parte di un'API RESTful, ma ovviamente mancano dei pezzi. La regola generale è ovviamente quella di usare i metodi HTTP per implementare le tipiche operazioni CRUD.

In particolare:

- GET --> sull'URL della collezione restituisce tutta la collezione, sull'URL del singolo elemento restituisce il singolo elemento
- POST --> sempre e solo sull'URL della collezione, aggiunge un nuovo elemento alla collezione
- PUT --> modifica/agiorna, sull'URL della collezione dovrebbe sostituire l'intera collezione ( ma praticamente non si usa mai ), sull'URL dell'elemento modifica quest'ultimo
DELETE --> cancella, sull'URL della collezione dovrebbe cancellare tutto ( ma nella pratica non si fa ), sull'URL dell'elemento lo elimina

Quando parlo di URL della collezione e dell'elemento mi riferisco all'uso dell'url rewrite ( o tecniche simili ) server-side, cioè non devi effettuare una GET su getUsers.php ma su http://blahblah/users. E se vuoi operare su uno specifico utente? http://blahblah/users/id-utente ( o altra stringa che ti consente di identificare il particolare elemento/riga nel db )

Detto questo devi considerare che le operazioni di letture ( GET ) non devono avere side-effects, cioè modificare lo stato della banca dati o di variabili globali negli script server-side. Le operazioni di scrittura devono invece essere idempotenti, cioè anche se chiamate mille volte ( con gli stessi parametri ) devono produrre la stessa identica modifica sul db.
 

LowSlow

Utente Attivo
419
13
CPU
Intel Core i7 8700 3,2 GHz Coffee lake
Dissipatore
Arctic Cooling Freezer 11 LP
Scheda Madre
Gigabyte Z370P D3
HDD
Adata SSD XPG SX6000 M.2 512 GB - Seagate 500 GB Sata 3 7200 rpm - Samsung 320 GB SATA2 7200rpm
RAM
G.skill Aegis 16 GB DDR4 2400 Mhz
GPU
Gigabyte Nvidia GeForce GTX 960 2 GB
Audio
Integrata
Monitor
Samsung SyncMaster EX2220 22" FullHD LED
PSU
Cooler Master 600w
Case
Cooler Master Elite 430 Black
OS
Windows 10
Si, quanto hai scritto è una parte di un'API RESTful, ma ovviamente mancano dei pezzi. La regola generale è ovviamente quella di usare i metodi HTTP per implementare le tipiche operazioni CRUD.

In particolare:

- GET --> sull'URL della collezione restituisce tutta la collezione, sull'URL del singolo elemento restituisce il singolo elemento
- POST --> sempre e solo sull'URL della collezione, aggiunge un nuovo elemento alla collezione
- PUT --> modifica/agiorna, sull'URL della collezione dovrebbe sostituire l'intera collezione ( ma praticamente non si usa mai ), sull'URL dell'elemento modifica quest'ultimo
DELETE --> cancella, sull'URL della collezione dovrebbe cancellare tutto ( ma nella pratica non si fa ), sull'URL dell'elemento lo elimina

Quando parlo di URL della collezione e dell'elemento mi riferisco all'uso dell'url rewrite ( o tecniche simili ) server-side, cioè non devi effettuare una GET su getUsers.php ma su http://blahblah/users. E se vuoi operare su uno specifico utente? http://blahblah/users/id-utente ( o altra stringa che ti consente di identificare il particolare elemento/riga nel db )

Detto questo devi considerare che le operazioni di letture ( GET ) non devono avere side-effects, cioè modificare lo stato della banca dati o di variabili globali negli script server-side. Le operazioni di scrittura devono invece essere idempotenti, cioè anche se chiamate mille volte ( con gli stessi parametri ) devono produrre la stessa identica modifica sul db.
Intanto grazie per la spiegazione.
Non mi è chiara una cosa, come dicevo prima, per esempio per prendere gli utenti ho creato questo file php che ho chiamato getUsers.php e quando mi servono gli utenti faccio (dalla web-app) un get su http://localhost/.../getUsers.php, invece cosa dovrei fare? Devo chiamare una pagina html che richiama il php?
Non ho capito :(
 

pabloski

Utente Èlite
2,868
916
Intanto grazie per la spiegazione.
Non mi è chiara una cosa, come dicevo prima, per esempio per prendere gli utenti ho creato questo file php che ho chiamato getUsers.php e quando mi servono gli utenti faccio (dalla web-app) un get su http://localhost/.../getUsers.php, invece cosa dovrei fare? Devo chiamare una pagina html che richiama il php?
Non ho capito :(

Se stai usando un normale web server, allora devi implementare l'url rewriting affinchè tutte le richieste GET vengano indirizzate ad un unico script, che poi si occuperà di estrarre gli elementi dell'url e decidere cosa fare.

Questo non serve se si usano strumenti lato server che implementano nativamente i web service, tipo Apache Tomcat o un tuo web service realizzato tramite un linguaggio come Go.

Fattivamente richiamare script php fa le stesse cose che faresti nell'altro modo, ma non è conforme allo standard REST.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!