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
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
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.
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
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
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
Il existe plusieurs méthodes pour s'authentifier auprès d'un service Web :
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)
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 :
Il est souvent utile de pouvoir échanger de l'information « structurée » entre applications
Solutions actuelles
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 }
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).
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 …
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.
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();