archi api

Etape 1 : Installation et démarrage

  • Installer composer, puis dans le répertoire de votre projet sur le serveur web en PHP7, grâce à une invite de commande, exécuter composer require slim/slim “3”
  • Ajouter un fichier .htaccesss qui contient le code suivant dans le repertoire de votre projet:
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [QSA,L]
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods: "POST,GET,OPTIONS"
    Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
  • Réaliser une page qui appelle une URL ‘bonjour’ sur le serveur SLIM avec la méthode GET. On pourra s’aider de l’extension RESTED de Firefox.
  • Le serveur devra renvoyer bonjour qui sera affiché par la page d’appel

Exemple de code client

$( document ).ready(function() {

$('#btn-valide').click(function(){ 
$.ajax({ 
      type: "POST",
      contentType: 'application/json; charset=utf-8',
      url: "http://localhost/serveur/gateau,
     success: function(data){
         alert("gateau");
      }
 });
});
 });

Exemple de code serveur

<?php 
require 'vendor/autoload.php';
use \Psr\Http\Message\{ServerRequestInterface as Request,ResponseInterface as Response};

$app = new \Slim\App;
$app->post('/zaza', function(Request $request, Response $response){	
	return "wazaaaaaaaa";
});
$app->run();
?>

 

Etape 2 : Récupération d’information via l’URL

  • Réaliser une page formulaire.html qui permette de saisir un login et un mot de passe.
  • Récupérer les informations sur SLIM grâce à une page index.php et renvoyer les 2 valeurs au navigateur.

Exemple de code client

  $( document ).ready(function() {

  $('#btn-new-liste').click(function(){ 
    let idx=$('#idx').val();
      $.ajax({ 
      type: "GET",
      url: "http://localhost/serveur/gateau/"+idx,
      success: function(data){  
        $("#result").html(data);
      }
    });
  });
 });

Exemple de code serveur

$app->get('/gateau/{id}', function(Request $request, Response $response){
	$id = $request->getAttribute('id');
       return $id;
});

 

Etape 3 : Récupération d’information via des paramètres dans l’URL

  • Réaliser un formulaire de création d’un client.
  • Envoyer les informations à SLIM en JSON avec la méthode POST.
  • Récupérer les informations sur le serveur SLIM
  • Réaliser une insertion du client grâce à une requête SQL sur le serveur SLIM.

Exemple de code client

$('#btn-valide').click(function(){ 
let id=$('#id').val();
let nom=$('#nom').val();
$.ajax({ 
      type: "POST",
      contentType: 'application/json; charset=utf-8',
      url: "http://localhost/serveur/gateau?id="+id+"&nom="+nom,
     success: function(data){
          //gateau enregistré
         alert("gateau enregistré");
      }
 });
});

Exemple de code serveur

$app->post('/gateau', function(Request $request, Response $response){
	$id = $request->getQueryParam('id');	
	$nom = $request->getQueryParam('nom');	
        //fonction d'insertion
	return setGateau($id, $nom);
});
function connexion()
{
    /*IBM Cloud
     * $vcap_services = json_decode($_ENV['VCAP_SERVICES'], true);
     * $uri = $vcap_services['compose-for-mysql'][0]['credentials']['uri'];
     * $db_creds = parse_url($uri);
     * $dbname = "patisserie";
     * $dsn = "mysql:host=" . $db_creds['host'] . ";port=" . $db_creds['port'] . ";dbname=" . $dbname;
     * return $dbh = new PDO($dsn, $db_creds['user'], $db_creds['pass'],array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
     * */
    //autre
    return $dbh = new PDO("mysql:host=localhost;dbname=patisserie", 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
}
function setGateau($id, $nom)
{
    $sql = "INSERT INTO gateau VALUES(:id, :nom))";
    try {
        $dbh = connexion();

        $req = $dbh->prepare($sql);
        $res = $req->execute(array(
            ':id' => $id,
            ':nom' => $nom,
        ));
        return $res;
    } catch (PDOException $e) {
        return '{"error":' . $e->getMessage() . '}}';
    }
}

$app->run();

Etape 4 : Envoie d’information en JSON depuis le serveur

  1. Permettre lors de l’appel de l’url clients d’afficher tous les clients. Le serveur SLIM renverra un tableau en JSON.

Exemple de code client

$('#btn-valide').click(function(){ 
$.ajax({ 
      type: "GET",
      contentType: 'application/json; charset=utf-8',
      url: "http://localhost/serveur/gateaux,
     success: function(data){
          alert(data);
      }
 });
});

Exemple de code serveur

$app->get('/gateaux', function(Request $request, Response $response){
	return getGateaux();
});
function getGateaux()
{
	$sql = "SELECT * FROM gateau";
	try{
		$dbh=connexion();
		$statement = $dbh->prepare($sql);
		$statement->execute();
		 $result = $statement->fetchAll(PDO::FETCH_CLASS); 
                 return json_encode($result, JSON_PRETTY_PRINT);
	} catch(PDOException $e){
		return '{"error":'.$e->getMessage().'}}';
	}
}

Etape 5 : Documentation

Utiliser Swagger pour générer une documentation
https://swagger.io/
https://github.com/zircote/swagger-php

/**
* @SWG\Swagger(
* schemes={"https"},
* host="mybluemix.net",
* basePath="/gateau",
* @SWG\Info(
* version="1.1.0",
* title="API Gatêau",
* description="Enregistrement et affichage de Gâteaux",
* @SWG\Contact(
* email="zaza"
* ),
* @SWG\License(
* name="Apache 2.0",
* url="http://www.apache.org/licenses/LICENSE-2.0.html"
* )
* ),
* )
*/

/**
* @SWG\Tag(
* name="gateau",
* description="Operations about gateau",
* )
*/

$app = new \Slim\App;

error_reporting(E_ALL);
ini_set('display_errors', 1);

/**
* @SWG\Post(
* path="/gateau",
* tags={"gateau"},
* summary="Inserer un gateau",
* description="Inserer un gateau",
* @SWG\Parameter(
* name="id",
* in="header",
* required=true,
* type="integer"
* ),
* @SWG\Parameter(
* name="nom",
* in="header",
* required=true,
* type="string"
* ),
* @SWG\Response(
* response=200,
* description="successful operation",
* @SWG\Schema(
* type="object"
* ),
* )
* )
*/
$app->post('/gateau', function(Request $request, Response $response){
//$gateau = json_decode($request->getBody());
$id = $request->getQueryParam('id');
$nom = $request->getQueryParam('nom');
return setGateau($id, $nom);
});