Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Développer des services REST en Java
  3. Pour aller plus loin
Extrait - Développer des services REST en Java Échanger des données au format JSON
Extraits du livre
Développer des services REST en Java Échanger des données au format JSON Revenir à la page d'achat du livre

Pour aller plus loin

D’autres façons d’aborder REST

Dans le chapitre précédent, trois outils ont été abordés pour fabriquer et consommer des services REST.

Dans les paragraphes qui suivent seront présentés :

  • un client générique réalisé à partir de la classe java.net.URL.

  • un client réalisé à partir des objets Apache HttpComponents.

  • des services REST réalisés avec Spring Data REST.

  • des services REST réalisés avec Play Framework.

1. java.net.URL

Voici un exemple de client écrit en Java et permettant d’accéder au service REST, de manière authentifiée et de manière générique, et donc utilisable avec l’ensemble des services définis dans le chapitre précédent.

La classe URLClient contenant le code décrit plus bas est dans le code du projet ApacheCXF fourni avec ce livre.

Dans un premier temps, des variables sont créées afin de contenir les informations de connexion au service REST.


final String page  
    = "http://localhost:8080/apache-cxf/Musique/TitreMusique/1"; 
 
final String nomDUtilisateur = "nom1"; 
final String motDePasse = "motdepasse1"; 
 
final String chaineConnexion = nomDUtilisateur + ":" + motDePasse; 
 
final byte[] code = Base64.encode(chaineConnexion.getBytes()); 
 
final String chaineEncodee = new String(code);
 

Puis des objets URL et URLConnection du package java.net sont créés pour ouvrir la connexion.


final URL url = new URL(page); 
final URLConnection connexion = url.openConnection(); 
 
connexion.setRequestProperty( 
    "Authorization", "Basic " + chaineEncodee 
); 
 
connexion.setRequestProperty( 
        "Content-Type", "URLConnection" 
);
 

La réponse du serveur REST est lue.


final InputStream inputStream = connexion.getInputStream(); 
 
final InputStreamReader lecteur  
    = new InputStreamReader(inputStream); 
 
int etat; 
final char[] donnees = new char[1024]; 
final StringBuilder stringBuilder = new StringBuilder(); 
 
while ((etat = lecteur.read(donnees)) > 0) { 
    stringBuilder.append(donnees...

Mise en cache

La mise en cache est un processus permettant de ne pas recalculer des données qui ont été calculées auparavant. Il en découle une amélioration du temps de traitement.

Le cache peut être positionné en plusieurs endroits, directement dans l’application, dans le serveur Apache ou dans le client (navigateur ou autre).

1. Apache

La gestion du cache prend plusieurs formes sous le serveur HTTP Apache, disponibles à l’aide de modules.

Le module expires permet d’ajouter automatiquement l’en-tête HTTP Expires aux réponses du serveur, en-tête différent selon le type de flux retourné. Ainsi, le client peut mettre en cache l’information de son côté et ne plus requêter cette donnée avant la durée définie.

Le module cache permet à Apache de gérer directement du cache et de ne pas lire sur le disque un fichier, ou ne pas faire d’appel dynamique à un script (PHP, Java, CGI (Common Gateway Interface)…).

a. Activation et désactivation d’un module

Les modules disponibles dans Apache sont listés sous Linux, sous la forme de fichiers dans le sous-répertoire mods-available.

Les modules activés sont représentés dans le sous-répertoire mods-enabled. Chaque module actif possède un lien symbolique dans ce répertoire qui pointe vers le fichier du module dans le sous-répertoire mods-available.

Pour activer ou désactiver un module, il est possible de gérer manuellement ces liens symboliques mais le plus simple reste d’utiliser les commandes a2enmod et a2dismod (respectivement Apache 2 Enable Module et Apache 2 Disable Module).

Si le nom du module est connu, la commande prend la forme suivante :


#a2enmod NOMDUMODULE 
#a2dismod NOMDUMODULE
 

Mais si un doute existe sur le nom du module, ou si on cherche à activer (désactiver) plusieurs modules, il suffit de lancer la commande sans paramètres pour que le script affiche les choix possibles.


#a2enmod 
#a2dismod
 
images/05ei30.png

Ensuite il faut redémarrer Apache pour que les modifications soient prises en compte.


service apache2 restart
 
images/05ei31.png

b. Module expires

Après avoir vérifié que le module expires est activé, sa mise en place s’effectue dans la configuration du site (fichier...

Exemples d’API REST

1. Facebook

Facebook met à disposition des développeurs une API permettant d’accéder aux données créées par leurs utilisateurs. La documentation de cette API est disponible à l’adresse suivante : https://developers.facebook.com/docs/graph-api/

Pour que Facebook puisse réguler les applications qui utilisent l’API, l’application doit s’authentifier à l’aide du protocole OAuth 2.0. Puis, puisqu’une grande partie des données n’est pas publique, pour chaque utilisateur auquel elle voudra accéder, l’application devra demander des permissions.

L’équipe de Facebook met à disposition ce qu’elle appelle le Graph Explorer pour tester au sein de sa documentation différentes requêtes : https://developers.facebook.com/tools/explorer/

Voici un appel en GET à /me :

images/05ei07.png

L’API de Facebook permet de filtrer une requête avec des paramètres pour ne pas retourner l’intégralité d’un JSON.


GET /me?fields=birthday
 
images/05ei08.png

En tant qu’API REST, l’API de Facebook ne propose pas que des accès en lecture avec la méthode HTTP GET.

Elle permet aussi, par exemple, de créer des ressources : un appel en méthode POST sur l’adresse /me/events permet de créer un événement.

images/05ei09.png

Ou encore, elle permet de supprimer...

Restlet

Restlet est un framework permettant de développer des services REST non seulement en JEE (Java Entreprise Edition) mais également en Java SE (Java Standard Edition), OSGi (Open Services Gateway Initiative), GAE (Google App Engine), Android et GWT (Google Web Toolkit).

Restlet permet, au choix, de fournir ou de consommer des services REST.

1. Création d’un projet JEE

Voici la procédure pour créer un projet JEE avec Restlet, pour Eclipse, qui permettra de faire fonctionner des services dont les retours JSON seront générés par Jackson.

Taper en ligne de commandes :


mkdir Restlet 
cd Restlet 
mvn archetype:create -DgroupId=com.book -DartifactId=RestletJEE  
                     -DarchetypeArtifactId=maven-archetype-webapp 
cd RestletJEE 
mvn eclipse:eclipse -Dwtpversion=2.0
 

Sous Eclipse, dans le menu File, sélectionner Import - Existing Projects into Workspace - Next. Dans le champ Select root directory, inscrire le répertoire d’installation de l’application puis cliquer sur le bouton Finish.

Il faut maintenant faire un clic droit sur le projet RestletJEE pour corriger certaines propriétés incorrectes : Properties - Project Facets. Changer la version de Java de 1.4 à 1.6. Puis dans Java Build Path, onglet Libraries, vérifier le JRE utilisé.

Il faut ensuite ajouter un emplacement pour les sources Java. Faire un clic droit sur Java Resources - New - Source Folder. Indiquer dans Project Name : RestletJEE et dans Folder name : src/main/java.

a. Modification du fichier pom.xml

Dans le fichier pom.xml, il faut ajouter un repository (dépôt d’archives).


<repositories> 
    <repository> 
        <id>restlet</id> 
        <url>http://maven.restlet.org/</url> 
    </repository> 
</repositories>
 

Il faut aussi ajouter une propriété.


<properties> 
    <basecamp.server.contextpath> 
        basecamp 
    </basecamp.server.contextpath> 
</properties>
 

Dans la liste des dépendances, il faut référencer Restlet ainsi que Jackson et JAX-RS.


 <dependency> 
    <groupId>org.restlet.jee</groupId> ...

HATEOAS

HATEOAS (Hypermedia As The Engine Of Application State) est une contrainte des applications REST. Il s’agit de mettre en place, de manière systématique, dans les retours des requêtes GET, des liens vers d’autres ressources liées ou actions. 

Ainsi, à partir d’une première URL, il devient possible, par découvertes successives, d’accéder à l’ensemble du catalogue.

Pour comparaison, depuis la page d’accueil d’un site Internet, il serait possible de parcourir petit à petit l’ensemble des données du site, ce qui est idéal en termes de référencement.

L’inconvénient est qu’en JSON, il faut définir la manière de retranscrire lesdites URL. Il existe plusieurs standards pour donner ces informations. Il est donc nécessaire au préalable que le fournisseur et le client se soient mis d’accord sur le mode de transmission des URL.