Services Web
Style d'architecture REST

John Samuel
CPE Lyon

Année: 2018-2019
Courriel: john(dot)samuel(at)cpe(dot)fr

Creative Commons License

Services Web

Objectifs

  1. Interaction homme-machine
    • Architecture client-serveur
    • Réécriture d'URL
  2. Interaction machine-machine
    • Style d'architecture REST
  3. Documentation d'une API

Rémarques: Programmation en live

1. Interaction homme-machine

Interaction homme-machine

1. Interaction homme-machine

Interaction homme-machine

1. Interaction homme-machine

Interaction homme-machine

1. Interaction homme-machine

Interaction homme-machine

1.1 Choix d'URL

URL

https://www.example.com/index.html

ou

https://www.example.com/index.php

ou

https://www.example.com/

1.1 Choix d'URL

URL

https://www.example.com/index.php?lang=fr
https://www.example.com/index.php?lang=en
https://www.example.com/index.php?lang=es

ou

https://www.example.com/fr/index.php
https://www.example.com/en/index.php
https://www.example.com/es/index.php

1.1 Choix d'URL

URL

https://www.example.com/fr/index.php
https://www.example.com/en/index.php
https://www.example.com/es/index.php

ou

https://www.example.com/fr/
https://www.example.com/en/
https://www.example.com/es/

1.1 Choix d'URL

URL

https://www.example.com/index.php?operation=listStudents

ou

https://www.example.com/students/

1.1 Choix d'URL

URL

https://www.example.com/index.php?operation=showStudent
https://www.example.com/index.php?operation=AddStudent
https://www.example.com/index.php?operation=deleteStudent
https://www.example.com/index.php?operation=updateStudent

ou

https://www.example.com/students/1/

1.2. Réécriture d'URL

1.2. Réécriture d'URL (URL rewriting)

Installation d'apache

$ sudo apt install apache2 php7.0 libapache2-mod-php7.0

Activation de réécriture

$ sudo a2enmod rewrite
$ sudo service apache2 restart

1.2. Réécriture d'URL

Vérification

<?php
 phpinfo()
?>

screenshot of php mod_rewrite enabled

1.2. Réécriture d'URL

Configuration (Activation des fichiers .htaccess)

Vérifier le fichier /etc/apache2/sites-available/000-default.conf

DocumentRoot /var/www/html
..
<Directory "/var/www/html">
 AllowOverride All
</Directory>

Redémarrer apache2

$ sudo service apache2 restart

1.2. Réécriture d'URL

Redirection transparente vers index.php

.htaccess

DirectoryIndex index.php

1.2. Réécriture d'URL

Redirection transparente vers index.php

.htaccess

DirectoryIndex accueil.php

1.2. Réécriture d'URL

Redirection transparente vers index.php

.htaccess

DirectoryIndex accueil.php index.php

1.2. Réécriture d'URL

.htaccess

RewriteEngine on
RewriteRule ^test.html$ /index.php

1.2. Réécriture d'URL

.htaccess

RewriteEngine on
RewriteRule "^.+.html$" /index.php

1.2. Réécriture d'URL

.htaccess

RewriteEngine on
ErrorDocument 404 /404.php
RewriteRule "^(.+)/index.php$" /index.php?lang=$1

1.2. Réécriture d'URL

.htaccess

RewriteEngine on
RewriteRule "^(.+)/index.html$" /index.php?lang=$1

1.2. Réécriture d'URL

.htaccess

RewriteEngine on
RewriteRule ^students/(.+)/$ /students/index.php?id=$1
RewriteRule ^students/(.+)/(.+)$ /students/index.php?id=$1&param=$2

1.2. Réécriture d'URL

Erreur ressource non trouvée

.htaccess

RewriteEngine on
ErrorDocument 404 /404.php

1.3. Récupération des valeurs d'un formulaire

     <fieldset>
       <legend>Etudiant.e</legend>
        <div>
         <label for="nom">Nom</label><input type="text" id="nom" name="nom"/>
        </div> <div>
         <label for="prenom">Prénom</label><input type="text" name="prenom"/>
        </div> <div>
         <label for="prenom">Diplôme</label>
         <select id="diplome" name="diplome">
           <option>IRC</option>
           <option>ETI</option>
         </select>
        </div>
     </fieldset>
   
		

1.3. Récupération des valeurs d'un formulaire

Récupération des valeurs

Etudiant.e

1.3. Récupération des valeurs d'un formulaire

method="get"

     <form action=request.php" method="get" >
       <fieldset>
       ...
       </fieldset>
       <button type="submit">Submit</button>
     </form>
   

Services Web

1.3. Récupération des valeurs d'un formulaire

<?php
$method = $_SERVER['REQUEST_METHOD'];
echo "method: ".$method;
?>

1.3. Récupération des valeurs d'un formulaire

method="get"

     <form action=request.php" method="get" >
       <fieldset>
       ...
       </fieldset>
       <button type="submit">Submit</button>
     </form>
   

URL (navigateur) et l'affichage sur le serveur

      http://localhost/request.php?nom=aple&prenom=mango&diplome=IRC
      method: GET
   

1.3. Récupération des valeurs d'un formulaire

method="post"

     <form action=request.php" method="post" >
       <fieldset>
       ...
       </fieldset>
       <button type="submit">Submit</button>
     </form>
   

URL (navigateur) et l'affichage sur le serveur

      http://localhost/request.php
      method: POST
   

1.3. Récupération des valeurs d'un formulaire

method="put"

     <form action=request.php" method="PUT" >
       <fieldset>
       ...
       </fieldset>
       <button type="submit">Submit</button>
     </form>
   

URL (navigateur) et l'affichage sur le serveur

      http://localhost/request.php?nom=aple&prenom=mango&diplome=IRC
      method: GET
   

Services Web

method="delete"

     <form action=request.php" method="delete" >
       <fieldset>
       ...
       </fieldset>
       <button type="submit">Submit</button>
     </form>
   

URL (navigateur) et l'affichage sur le serveur

      http://localhost/request.php?nom=aple&prenom=mango&diplome=IRC
      method: GET
   

1.4. Exemple: Réécriture d'URL et Récupération des valeurs

.htaccess

RewriteEngine on
ErrorDocument 404 /404.php
RewriteRule "^(.+)/index.php$" /index.php?lang=$1

1.4. Exemple: Réécriture d'URL et Récupération des valeurs

Récupération des valeurs GET: PHP

<?php
$language = "fr";
if($_GET["lang"]) {
  $language = $_GET["lang"];
}
if($language == "en") {
  echo "Hello!";
}
else if($language == "fr") {
  echo "Bonjour!";
}
?>

1.5. Exemple: Récupération des valeurs

Récupération des valeurs GET: PHP

<?php
if($_GET["nom"] && $_GET["prenom"] ) {
  echo "Bonjour! ".$_GET["prenom"]." ".$_GET["nom"];
}
?>

1.5. Exemple: Récupération des valeurs

Récupération des valeurs POST: PHP

<?php
if($_POST["nom"] && $_POST["prenom"] ) {
  echo "Bonjour! ".$_POST["prenom"]." ".$_POST["nom"];
}
?>

1.5. Exemple: Récupération des valeurs

Récupération des valeurs PUT, DELETE: PHP

<?php
if($_GET["nom"] && $_GET["prenom"] ) {
  echo "Bonjour! ".$_GET["prenom"]." ".$_GET["nom"];
}
?>

1.5. Exemple: Récupération des valeurs

Récupération des valeurs GET, POST, PUT, DELETE: PHP

<?php
if(strcasecmp($_SERVER["REQUEST_METHOD"], "POST") == 0) {
  if($_POST["nom"] && $_POST["prenom"] ) {
    echo "Bonjour! ".$_POST["prenom"]." ".$_POST["nom"];
  }
}
else {
  if($_GET["nom"] && $_GET["prenom"] ) {
    echo "Bonjour! ".$_GET["prenom"]." ".$_GET["nom"];
  }
}
?>

1.6. Déboggage: Enregistrement de données

Enregistrement de données (Serveur Apache)

                     $ tail /var/log/apache2/access.log
                   
127.0.0.1 - - [14/Nov/2018:14:46:49 +0100] "GET / HTTP/1.1" 200 3477 "-"
         "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0"
127.0.0.1 - - [14/Nov/2018:14:46:49 +0100] "GET /icons/ubuntu-logo.png HTTP/1.1" 304 180 "http://localhost/"
         "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0"
127.0.0.1 - - [14/Nov/2018:14:46:49 +0100] "GET /favicon.ico HTTP/1.1" 404 294 "-"
         "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0"
                   

1.6. Déboggage: Enregistrement de données

Enregistrement de données (Serveur Apache)

                     $ tail /var/log/apache2/error.log
                   
[Wed Nov 14 09:53:39.563044 2018] [mpm_prefork:notice] [pid 849]
         AH00163: Apache/2.4.29 (Ubuntu) configured -- resuming normal operations
[Wed Nov 14 09:53:39.563066 2018] [core:notice] [pid 849]
         AH00094: Command line: '/usr/sbin/apache2'
[Wed Nov 14 11:35:35.060638 2018] [mpm_prefork:notice] [pid 849]
         AH00169: caught SIGTERM, shutting down
                   

1.6. Déboggage: Enregistrement de données

Enregistrement de données (Serveur Apache)

LogLevel (https://httpd.apache.org/docs/2.4/mod/core.html#loglevel)

1.6. Déboggage: Enregistrement de données

Enregistrement de données (Serveur Apache)

Log Format (https://httpd.apache.org/docs/2.4/mod/core.html#errorlogformat)

2. Style d'architecture REST

2. Style d'architecture REST

2.1. Style d'architecture REST: Contraintes

Contraintes

Une architecture REST doit respecter les six contraintes suivantes

  1. un architecture client-serveur
  2. Un serveur sans état
  3. Avec cache
  4. À interface uniforme
  5. En couches
  6. Code à la demande (facultatif)

2.1. Style d'architecture REST: Contraintes

1. Architecture client-serveur

2.1. Style d'architecture REST: Contraintes

2. Un serveur sans état

2.1. Style d'architecture REST: Contraintes

3. Avec cache

2.1. Style d'architecture REST: Contraintes

4. À interface uniforme

2.1. Style d'architecture REST: Contraintes

4. À interface uniforme

  1. identification des ressources
  2. manipulation des ressources par des représentations (XML, JSON etc.)
  3. messages auto-descriptifs
  4. hypermédia comme moteur d'état de l'application

2.1. Style d'architecture REST: Contraintes

4. À interface uniforme

Hypermédia en tant que moteur de l'état d'application

Un client REST n'a besoin d'aucune connaissance préalable sur la façon d'interagir avec une application ou un serveur particulier au-delà d'une compréhension générique de l'hypermédia.

2.1. Style d'architecture REST: Contraintes

5. En couches

2.1. Style d'architecture REST: Contraintes

6. Code à la demande (facultatif)

2.2. Style d'architecture REST: Exemple

API Github (REST)

REST API of Github

2.2. Style d'architecture REST: Exemple

RESTful Services Web

Différents niveaux [2]

  1. Niveau 0: HTTP
  2. Niveau 1: Ressources
  3. Niveau 2: Verbs HTTP (GET, POST, PUT, DELETE)
  4. Niveau 3: Hypermedia
https://www.example.com/students/
https://www.example.com/students/1/
https://www.example.com/students/1/module1/

2.2. Style d'architecture REST: Exemple

Liste des codes HTTP

  1. 1xx - Information
  2. 2xx - Succès
  3. 3xx - Redirection
  4. 4xx - Erreur du client web
  5. 5xx - Erreur du serveur / du serveur d'application

2.2. Style d'architecture REST: Exemple

Liste des codes HTTP

Les codes les plus courants sont :

  1. 200 : succès de la requête ;
  2. 301 et 302 : redirection, respectivement permanente et temporaire ;
  3. 401 : utilisateur non authentifié ;
  4. 403 : accès refusé ;
  5. 404 : page non trouvée ;
  6. 500 et 503 : erreur serveur ;
  7. 504 : le serveur n'a pas répondu.

2.3. Conception et création d'API Restful

cURL

  1. client URL request library : « bibliothèque de requêtes aux URL pour les clients »
$ curl example.com

2.3. Conception et création d'API Restful

cURL: en-tête (header)

$ curl -I http://localhost/index.php

Sortie

HTTP/1.1 200 OK
Date: Thu, 26 Apr 2018 18:54:18 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 14
Content-Type: text/html; charset=UTF-8

2.3. Conception et création d'API Restful

cURL: GET

$ curl http://localhost/index.php
$ curl -X GET http://localhost/index.php

2.3. Conception et création d'API Restful

cURL: POST

$ curl -X POST http://localhost/index.php
$ curl -X POST --data 'user:abc' http://localhost/index.php
$ curl -X POST -d @file.json http://localhost/index.php

2.3. Conception et création d'API Restful

cURL: PUT

$ curl -X PUT http://localhost/index.php
$ curl -X PUT --data '' http://localhost/index.php
$ curl -X PUT -d @file.json http://localhost/index.php

2.3. Conception et création d'API Restful

cURL: DELETE

$ curl -X DELETE http://localhost/index.php

2.3. Conception et création d'API Restful

méthode HTTP

$_SERVER['REQUEST_METHOD']

2.3. Conception et création d'API Restful

PHP: récupération de paramètres

$data = json_decode(file_get_contents('php://input'), true);

2.3. Conception et création d'API Restful

PHP:

echo http_response_code(521);

2.3. Conception et création d'API Restful

.htaccess

RewriteEngine on
ErrorDocument 404 /404.php
RewriteRule ^(.+)/$ /index.php?resource=$1
RewriteRule ^(.+)/(.+)$ /index.php?resource=$1&id=$2

3. Documentation d'une API

REST API of Github

API Documenation

  1. Documentation lisible par l'homme
  2. Documentation lisible par machine
  3. Documentation lisible par l'homme et machine

3. Documentation d'une API

Documentation lisible par l'homme: Développeur/Développeuse

REST API of Github
  1. lit la documentation de l'API en format texte ou HTML
  2. développe du code pour l'intégration avec les services Web
  3. ajoute code métier

3. Documentation d'une API

REST API of Github

Documentation lisible par l'homme: Développeur/Développeuse

  1. surveille les changements de l'API
  2. Réécrit le code si l'API change

3. Documentation d'une API

API

  1. liste des opérations (méthodes)
    • paramètres d'entrée et de sortie
    • erreurs
  2. format du messagei (json, xml etc.)
  3. mécanisme d'authentification
  4. mécanisme d'autorisation

3. Documentation d'une API

Documentation lisible par machine: WSDL

WSDL 1.1 vs 2.0

Le WSDL (Web Services Description Language) sert à décrire

  1. le protocole de communication (SOAP RPC ou SOAP orienté message)
  2. les méthodes (opérations)
  3. le format de messages (les types de données)
  4. la localisation du service

3. Documentation d'une API

WSDL 1.1 vs 2.0
WSDL: documentation, types, interfaces
WSDL 1.1 vs 2.0
WSDL: binding, services

3. Documentation d'une API

WSDL Libraries

  1. Java: wsimport, WSDL4J,..
  2. Python: zeep,..

3. Documentation d'une API

WADL (Web Application Description Language)

  1. décrit des applications REST
  2. décrit des ressources, méthodes, paramètres et réponses

3. Documentation d'une API

WADL
WADL: ressources, méthodes, paramètres et réponses

3. Documentation d'une API

SA-WSDL (Semantic Annotations for WSDL and XML Schema)

  1. définit un ensemble d'attributs d'extension pour WSDL et XSD
  2. permet des annotations sémantiques en utilisant des ontologies

3. Documentation d'une API

WADL
SA-WSDL: Annotation d'un fichier WSDL
WADL
SA-WSDL: Annotation d'un fichier WSDL

3. Documentation d'une API

hRESTS

  1. Documentation lisible par l'homme et machine
  2. utilise microformat HTML

3. Documentation d'une API

WADL
hRESTS: microformat

Services Web

Références

  1. Rodríguez, Carlos, et al. REST APIs: a large-scale analysis of compliance with principles and best practices. International Conference on Web Engineering. Springer, Cham, 2016.
  2. Pautasso, Cesare. RESTful web services: principles, patterns, emerging technologies. Web Services Foundations. Springer, New York, NY, 2014. 31-51.
  3. Samuel, John, and Christophe Rey. Integration of Multiple Heterogeneous and Autonomous Web Services using Mediation Approach: Open Challenges. Journal on Advances in Theoretical and Applied Informatics 2.2 (2016): 38-46.
  4. Kopecký, J., Gomadam, K., & Vitvar, T. Hrests: an html microformat for describing restful web services. IEEE/WIC/ACM International Conference on Web Intelligence and Intelligent Agent Technology (2008), 1, 619–625. https://doi.org/10.1109/WIIAT.2008.379

Services Web

Références

Services Web

Références