Programmation d'Applications Web Avancées

Cours 3
Services Web REST
JSON

kn@lri.fr

Services Web REST

Service Web

Un service Web est un moyen pour une application d'exposer son API au moyen du protocole HTTP

Il existe plusieurs méthodologies :

On utilisera des services Web REST

REST

Architecture issue de la thèse de Roy Thomas Fielding (2000, U. of Cal. Irvine)

Un service Web REST se caractérise de manière suivante :

Les contraintes de méthode sont les suivantes

Le contenu renvoyé par le service Web peut être quelconque, mais on privilégiera le JSON dans ce cours

Classe utilitaire/Appel de service Web

La classe HTTPUrlConnection permet de créer des requêtes HTTP en Java (voir la Javadoc). Pour des requêtes simples (GET) on poura utiliser uniquement la classe URL.

Exemples d'organisation URI/Méthodes HTTP (1)

Un site veut exporter une collection d'objets ainsi que des opérations sur ces derniers.
Url de collection : http://site.com/api/collection/

Url d'un objet : http://site.com/api/collection/object123

Exemples d'organisation URI/Méthodes HTTP (2)

S'il y a une base de donnée sous-jacente alors :
Url de collection : http://site.com/api/collection/

Url d'un objet : http://site.com/api/collection/object123

Stateless ?

Dans une architecture REST, le serveur ne conserve aucun état spécifique à chaque client (i.e. pas de session, ni de cookies).

Chaque client est responsable de conserver son état localement.

Un mecanisme d'authentification/authorisation doit être mis en place

Authentification

Il existe plusieurs méthodes pour s'authentifier auprès d'un service Web :

Basic Auth
Ajout du user:password dans un header HTTP Authorization
Avantage ⇒ simple
Inconvénient ⇒ peut sûr
API Key
Le client récupère auprès du serveur un secret qu'il ajoute à chaque requête (le secret peut être renouvelé fréquement). Avantage ⇒ simple
Inconvénient ⇒ peut sûr, non standard
OAuth
St Avantage ⇒ assez sûr, standardisé
Inconvénient ⇒ mise en place complexe

Étude de cas

Application mobile de réservation de billets d'avion.

Une compagnie aérienne possède un serveur de réservation de billets d'avions, accessible par une interface Web standard ainsi que via un service Web

Un exemple de consommateur du service Web peut être une application mobile native (i.e. pas une qui affiche le site web mobile)

Étude de cas : site Web

Étude de cas : Appli Mobile

Format de réponse

REST privilégie les réponses en mode texte. Le type mime de la réponse doit être spécifié dans les en-tête HTTP :

JSON

JSON (ou, le nouveau XML)

Il est souvent utile de pouvoir échanger de l'information « structurée » entre applications

Solutions actuelles

JSON : syntaxe

Une valeur JSON est représenté par un sous-ensemble de la syntaxe Javascript pour les objets.

{ "nom" : "Nguyen", "prénom" : "Kim", "cours": [ "PAWA", "LCD", "POS" ], "full time" : true, "age" : 3.6e1, "hobby" : null }

JSON : syntaxe (suite)

API Java pour JSON

Aucune API dans la bibliothèque standard Java (proposée initialement pour Java 9 puis abandonnée)

Une spécification « standard » fait partie de JEE 7 : JSON-P

Plusieurs implémentations de la spécification

(en pratique, ça se traduit par un .jar en plus dans le projet).

Factory design pattern (rappels)

Comme toutes les API complexes en Java (et dans les langages objets en général), JSON-P utilise le design pattern de Factory.

Pour créer un objet de type Foo on ne fait pas simplement new Foo(…); mais on utilise une classe FooFactory qui possède une méthode statique .createFoo(…)

Dans quel cas est-ce intéressant ?

Quand Foo est une interface. On ne peut pas faire new sur une interface. Il faut donc une méthode pour appeler le constructeur de la classe implémentant Foo puis qui le caste en Foo

Factory design pattern (exemple)

JSON-P

L'API JSON-P se décompose en plusieurs parties (javax.json.*):

On utilisera la classe Json contenant les factories, JsonObjectBuilder, JsonArrayBuilder pour construire des objets ou tableaux, et .toString() pour sérialiser.

Exemple

JsonObject jobj = Json.createObjectBuilder() .add("nom", "Nguyễn") .add("prénom", "Kim") .add("cours", Json.createArrayBuilder() .add("POS") .add("PAWA") .add("LCD")) .add("full time", true) .add("age", 3.6e1) .add("hobby", JsonValue.NULL) .build(); JsonReader r = Json.createReader(new FileReader("fichier.json")); JsonObject jobjO = r.readObject(); //Si on sait que c'est un objet JsonArray jobA = r.readArray(); //Si on sait que c'est un tableau JsonStructure job3 = r.read(); //Sinon, tester ensuite avec instanceOf r.close(); System.out.println(jobj); //appelle .toString();