class Restful

Classe Pubblica senza dipendenze.

I Metodi:

  1. send_data()
  2. get_()
  3. post_()
  4. put_()
  5. delete_()

Questo blocco permette di ricevere ed inviare informazioni in formato JSON. Sarà anche possibile realizzare un "piccolo" Web Services, ma ci tengo a dire che il suo utilizzo dovrà essere veramente limitato, (secondo me) per le limitazioni del PHP stesso. Se si ha la necessità di realizzare un WebServices complesso, più robusto o meglio più professionale, personalmente rivolgerei lo sguardo ad altri linguaggi, configurazioni e piattaforme.

Fatta questa breve premessa, per una piccala applicazione questa classe potrebbe tornarci estremamente utile.

Per facilitare l'apprendimendo della classe, creeremo un piccolo servizio di richiesta e risposta.

Note: importante avere nella configurazione del PHP le CURL attive!

Iniziomo con la creazione di un RESTClient


send_data():

Per prima cosa apriamo il nostro pannello di Admin e generiamo due nuove pagine del progetto chiamandole:

  • rest-client
  • rest-ws

Quindi lanciamo il programmino modifica_permessi.sh o settisamo i parametri manualmente (se non si lavora in Linux) seguendo la guida.

Ora apriamo il file di template rest-client.php e compiliamolo come segue:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Rest Client</title>
    </head>
    <body>
        <h1>REST Client</h1>
        <form class="" action="./" method="get">
            <b>Nome: <br>
            <input type="text" name="nome" value=""> <br>
            <b>Cognome: <br>
            <input type="text" name="cognome" value="" > <br><br>
            <button type="submit" name="send" value="1" >Invia Richiesta</button>
        </form>
        

</html>

Ora, apriamo il file view restClientView.php ed abilitiamo il blocco Restful (eventualmente potremmo disabilitare i blocchi che non ci interessano) e richiamiamo un metodo del model che andremo a costruire a breve :

<?php
// Codifica caratteri
header("Content-Type: text/html; charset=utf-8");
#header("Content-type: application/json");
$GLOBALS["Rgl"] = new $nameClass(
    array(
        #"Crypto", // gestione Criptazione
        #"Session", // gestione delle sessioni
        #"Language", // gestione delle lingue
        #"Avvisi", // gestore avvisi e alert
        #"Str", // trattamento delle stringhe
        #"DTime", // trattamento delle date
        #"VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        #"DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        "BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        #"LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        "Restful" // request and response restful,
    )
);

class RestClientView extends RestClientModel {

    # gestione contenuto pagina ####
    function view_page(){
        $response = "";
        if($_REQUEST['send']){
            $response = parent::rest_client($_REQUEST);
        }
        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'rest-client.php',
            $GLOBALS["Rgl"],
            array(
                'response'=>$response,
            )
        );
    }
}
RestClientView::view_page();
?>

Note: ho inserito la variabile globale $_REQUEST di proposito... i più esperti si saranno già fatti un'idea del perchè, per i meno esperti lo scopriremo a breve.

Ora apriamo il nostro file model restClientModel.php e creiamo il metodo rest_client():

<?php
class RestClientModel extends Rgl {
    # No __construct

    function rest_client($_){
        $url = _CONFIG_['_SITE_'].'rest-ws/';
        $type = $_SERVER['REQUEST_METHOD'];
        if($type == "GET"){
            $json = '';
            $get = '';
            foreach($_ AS $K=>$V){
                $get .= $K.'='.urlencode($V).'&';
            }
            $url = $url.'?'.$get;
        } else {
            $json = json_encode($_);
        }
        return Restful::send_data($url, $json, $type, 0);
    }
}
?>

Cosa abbiamo fatto con in questo metodo?

  • Abbiamo trasformato i dati inviati tramite il form nel formato JSON oppure in variabili GET collegate alla URL se la richietsa fosse di tipo GET ;
  • Abbiamo indicato una URL alla quale inviare questi dati;
  • Abbiamo indicato il tipo di metodo utilizzato (in questo caso POST, ma vedremo anche altri metodi);
  • Abbiamo richiamato il metodo send_data();

Questo metodo richiede 4 parametri:

  1. Un indirizzo di destinazione a cui inoltrare la richiesta;
  2. Un json da inviare;
  3. Un metodo tra GET, POST, PUT, DELETE;
  4. Un parametro Boolean per indicare se la risposta dovrà essere di tipo JSON (0) oppure di tipo ARRAY (1);

Ora, proviamo ad inserire i dati all'interno dei due campi, nome e cognome e premiamo il pulsante di invio. Se tutto è andato per il verso giusto dovremmo visualizzare:

★ REGOLO mf - beta 0.4.3 => Page: rest-ws.php

 Ora è giunto il momento di creare un Web Services utilizzando gli altri metodi indicati in precedenza.


get_(), post_(), put_(), delete_():

Per prima cosa dovremmo cancellare completamente il contenuto del tempate rest-ws.php.

Come seconda cosa apriremo il file view restWsView.php e scriveremo questo semplice codice:

<?php
// Codifica caratteri
header("Content-Type: text/html; charset=utf-8");
#header("Content-type: application/json");
$GLOBALS["Rgl"] = new $nameClass(
    array(
        #"Crypto", // gestione Criptazione
        #"Session", // gestione delle sessioni
        #"Language", // gestione delle lingue
        #"Avvisi", // gestore avvisi e alert
        #"Str", // trattamento delle stringhe
        #"DTime", // trattamento delle date
        #"VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        #"DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        #"BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        #"LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        "Restful" // request and response restful,
    )
);

class RestWsView extends RestWsModel {

    # gestione contenuto pagina ####
    function view_page(){
        $dati = Restful::get_();
        echo "Tipo di invio: ".$dati['method']."; dati inviati: ".$dati['input']['nome'].' '.$dati['input']['cognome'];
    }
}
RestWsView::view_page();
?>

Avete notato qualcosa di diverso rispetto al classico metodo view_page()?

Ora è estremamente ridotto e restituisce il risultato al client semplicemente con un echo. Questo perchè il risultato del Web Server non dovrà contenere altri dati se non la risposta.

Facciamo una prova concreta. Andiamo nella barra degli indirizzi del nostro browser preferito e scriviamo:

http://localhost/test/rest-client/

 Compiliamo i campi nome e cognome ed inviamo i dati. Se tutto è andato per il verso giusto dovremmo avere come risultato:

Tipo di invio: GET; dati inviati: [nome e cognome inserito]

IMPORTANTE: Prima di poter procedere però c'è da dire che il file di root index.php contiene:

<?php
if(file_exists('./start.php')){header("Location: start.php");}
require_once(dirname(__FILE__)."/Config/config.php");
require_once(_CONFIG_['_ROOT_']."Lib/rgl.php");
require_once(_CONFIG_['_ROOT_']."Lib/kuiper_belt.php");
require_once(_CONFIG_['_CONF_']."generate.php");
$kuiperBelt = new KuiperBelt($kuiper);
$kuiperBelt->kuiperBelt();
?>
<!--
Regolo mini framework
LICENSE MIT:
Copyright <?php echo date('Y');?> Regololab.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale,
use or other dealings in this Software without prior written authorization.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-->

Noteremo la presenza commentata della licenza. Se questa presenza in una pagina html normale non crea alcun problema, in una risposta di Web Services potrebbe crearne. Per evitare spiacevoli incongruenze ed eccezioni si consiglia di cancellare tutto il commento contenente la licenza, lasciando solo le righe:

<?php
if(file_exists('./start.php')){header("Location: start.php");}
require_once(dirname(__FILE__)."/Config/config.php");
require_once(_CONFIG_['_ROOT_']."Lib/rgl.php");
require_once(_CONFIG_['_ROOT_']."Lib/kuiper_belt.php");
require_once(_CONFIG_['_CONF_']."generate.php");
$kuiperBelt = new KuiperBelt($kuiper);
$kuiperBelt->kuiperBelt();
?>

Fino ad ora abbiamo visto come inviare una richiesta GET e ricevere una risposta testuale. Se invece volessimo inviare una richiesta in POST e ricevere una risposta in JSON per utilizzare il risultato ad esempio in JQuery?

Nulla di più semplice. Per prima cosa Spostiamoci nuovamente all'interno del template rest-client.php e modifichiamo il method da get a post:

<form class="" action="./" method="post">

Quindi spostamoci all'interno della view restWsView.php, commentiamo la riga contenente il Content-Type: text/html e decommentiamo la riga contenente Content-type: application/json,

e modifichiamo la risposta a video semplicemente:

<?php
// Codifica caratteri
#header("Content-Type: text/html; charset=utf-8");
header("Content-type: application/json");
$GLOBALS["Rgl"] = new $nameClass(
    array(
        #"Crypto", // gestione Criptazione
        #"Session", // gestione delle sessioni
        #"Language", // gestione delle lingue
        #"Avvisi", // gestore avvisi e alert
        #"Str", // trattamento delle stringhe
        #"DTime", // trattamento delle date
        #"VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        #"DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        #"BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        #"LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        "Restful" // request and response restful,
    )
);

class RestWsView extends RestWsModel {

    # gestione contenuto pagina ####
    function view_page(){
        $dati = Restful::get_();
        echo json_encode(
            array(
                "Type"=> $dati['method'],
                "Dati"=> $dati['input']
            )
        );
    }
}
RestWsView::view_page();
?>

Dovremmo ricevere questo tipo di risultato:

{"Type":"POST","Dati":{"nome":"Nome inserito","cognome":"cognome inserito","send":"1"}} 

Dovrebbe essere semplice, anche questo concetto... spero :-)

I metodi Put e Delete, sono identici al metodo Post. Il mio consiglio è quello di utilizzarli secondo le direttive di riferimento: https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

Spero sia stato semplice e chiara come spiegazione, nel caso mi impegnerò di più ;-)


Lista dei Blocchi