TP4 : Services Web REST

publicité
M2 SIR
2016-2017
TP4 : Services Web REST
Google Maps Geocoding API
Vous allez tester le service Geocoding de Google Map. Le geocodage est le processus qui permet
de convertir des adresses en coordonnees geographiques (comme latitude 37.423021 et
longitude -122.083739), que vous pouvez ensuite utiliser pour placer des marqueurs sur une
carte, ou pour positionner la carte1.
NetBeans met a disposition les acces a differents web services comme GoogleMap, FaceBook,
Twitter, Youtube, Zillow 2...
Vous allez tester le service Google Map Geocoding en suivant les instructions suivantes :




Vous aurez besoin d’une clé pour Google Map Geocoding. Vous allez vous rendre sur le
site suivant : https://developers.google.com/maps/documentation/javascript/get-api-key et
bien suivre les instructions pour la création de la clé. Sauvegardez la clé obtenue, vous
en aurez besoin.
Créer un nouveau projet de type Java Application et vérifier que la classe main est bien
créée.
Ajouter le service Google Map Geocoding, vous allez sur l’onglet Services et ouvrez le
nœud Web ServicesGoogleGeocoding Service.
Faire un drag et drop de « geocode » dans la méthode « main» . Vous pouvez modifier les
paramètres par défaut qui apparaissent dans le pop-up comme suit :
q = "vieux port, marseilles";
output = "xml"; // ou en json

Modifier votre main comme suit :
public static void main(String[] args) {
try {
String q = "vieux port, marseilles";
String output = "xml";
RestResponse result = GoogleGeocodingService.geocode(q,output);
if (result.getResponseCode()==200) {
System.out.println("The SaasService returned: "+result.getDataAsStri ng());
}
} catch (Exception ex) {
ex.printStackTrace();
} }

1
2
Votre projet a été modifié. En effet, 4 classes ont été créées :
o
GoogleGeocodingServiceAuthenticator.java : permet de vérifier la clé dans le
fichier properties.
o
RestConnection.java : permet d’établir la connexion avec les serveurs Google.
o
RestResponse.java : récupère les données retournées par Google.
https://developers.google.com/maps/documentation/geocoding/intro?hl=fr
https://netbeans.org/kb/docs/websvc/zillow.html
Page 1
M2 SIR
2016-2017
o
GoogleGeocodingService: représente la classe utilisée par votre servlet pour
interagir avec les autres classes et Google

Modifier le fichier « googlegeocodingserviceauthenticator.properties» qui se trouve sous
le package « org.netbeans.saas.google » en ajoutant la clé que vous avez récupérée.

Ouvrir la classe « GoogleGeocodingService.java » dans l’éditeur et modifier la méthode
« geocode » comme suit :
public static RestResponse geocode(String q, String output) throws
IOException {
String apiKey =
GoogleGeocodingServiceAuthenticator.getApiKey();
String[][] pathParams = new String[][]{};
String[][] queryParams = new String[][]{{"address", q},
{"key", "" + apiKey + ""},
{"output", output}};
RestConnection conn = new
RestConnection("https://maps.googleapis.com/maps/api/geocode/xml",
pathParams, queryParams);
sleep(1000);
return conn.get(null);
}

Tester.
Développement d’un service REST pour la réservation d’un hôtel
L’objectif de cet exercice est le developpement de services REST pour la recherche et la
reservation d’hotels a partir d’une base de donnees. Vous allez creer une base de donnees
d’hotels et generer des classes entites (grace a l’API JPA). On souhaite y donner l’acces via des
services web. Le service Web REST doit pouvoir lister l'ensemble des hotels, rechercher des
hotels selon des criteres de de recherche (ville, prix), de creer, de modifier, de supprimer et de
lister une reservation d’hotel pour un client donne.
Vous allez :
 Créer une base de données et générer des classes entités grâce à l’API JPA (e.g EclipseLink)
 Créer les services web REST à partir de la base de données
 Déployer les services web dans un serveur d’application (e.g Glassfish)
 Tester les services développés
 Créer un client pour consommer le service web
1. Création de de base de données
Vous allez utiliser dans cette partie une base de donnees MySQL ou Derby. Il faut savoir que
Glassfish ne comprend pas de driver MySQL. Il faut donc ajouter un connecteur MySQL que vous
pouvez telecharger a l’adresse suivante : http://dev.mysql.com/downloads/connector/j/ et
placer l’archive dans le dossier Lib de Glassfish.
Vous pouvez suivre le tutorial decrit sur le lien suivant : https://dzone.com/articles/nb-classglassfish-mysql-jdbc.
Page 2
M2 SIR
2016-2017
2. Génération des entités grâce à JPA
Vous allez creer un nouveau projet de type Java Web Application que vous nommerez
« HotelRes » et vous selectionnerez Glassfish comme serveur.
Vous allez :

Créer une classe entité (New Entity Class) que vous nommerez « Hotel » représentant
les hôtels par leur identifiant (idHotel), leur nom (nom_Hotel), leur adresse (adresse), leur
code postal (code_postal), leur ville (ville), le nombre d’étoiles (NbreEtoiles) et le prix (prix)
d’une nuitée. Lors de la création de l’entité, vous allez choisir EclipseLink comme
Fournisseur de persistence3 (Persistence Provider). Vous sélectionnerez ensuite comme
Data Source la base de données que vous venez de créer. Vous nommerez le package
ENTITE.

Ajouter les attributs ainsi que les méthodes manquantes (constructeurs, les getters et les
setters) dans la classe Hotel.java.

Quelle est la différence entre une classe Java et une classe entité ?
3. Création, déploiement et test du service de recherche d’hôtels

Créer un service web REST à partir de la classe entité « Hotel ». Pour cela, vous allez
sélectionner NewRestful Web Services from Entity Classes, choisir l’entité que vous avez
créée et générer le service. Que remarquez-vous ? .

Déployer (clic droit sur le projetdeploy) et tester le web service Rest (clic droit sur le
projet Test Restful Web Services. Quel résultat obtenez-vous et pourquoi?

Insérer des données dans la table de votre base de données et vérifier que votre contexte
de persistence (fichier « persistence.xml ») est en mode create. Refaire le test des services
web. Sélectionner GET (application/xml) et cliquer sur Test. Quel résultat obtenez-vous et
pourquoi?

Tester les différentes méthodes HTTP :
GET : pour récupérer tous les hôtels et rechercher les hôtels par leur id.
POST : pour créer un nouvel hôtel
PUT : pour modifier un hôtel
DELETE : pour supprimer un hôtel
Créer deux méthodes de recherche d’hôtels : une méthode de recherche par ville et une
méthode de recherche par prix et tester le service. Pour cela vous allez suivre les
indications suivantes :
Définir dans la classe entité Hotel une requête nommée de recherche d’hôtels par prix
grâce au langage JPQL4. Une requête nommée est déclarée dans une annotation
@NamedQuery. Cette annotation prend deux attributs : name, qui porte le nom de la
requête, et query, qui porte la requête JPQL. Plusieurs annotations @NamedQuery
peuvent être regroupées dans une annotation @NamedQueries, qui prend un tableau de

-
Les fournisseurs de persistance sont des implementations de la specification Java Persistence API (JPA) et peuvent
etre deployes dans le serveur d'applications compatible Java EE qui prend en charge la persistance JPA.
3
4
http://docs.oracle.com/cd/E17904_01/apirefs.1111/e13946/ejb3_langref.html
Page 3
M2 SIR
2016-2017
@NamedQuery en attribut. Ces deux annotations doivent être posées sur la classe d'une
entité JPA. Exemple : Une requête pour déterminer tous les hôtels :
@NamedQuery( name="findAllHotels", query="select c from Hotel c")
-
Définir dans la classe du service « HotelFacadeREST.java » les méthodes qui vont
respectivement retourner la liste des hôtels par leur prix et la ville. La méthode de
recherche par prix prendra comme paramètre le prix d’une nuitée d’hôtel grâce à
l’annotation @PathParam, exécutera la requête définie précédemment grâce à la méthode
EntityManager.createNamedQuery() en lui passant le nom de la requête tel qu’il est défini
dans les annotations. Cette méthode renvoie un objet Query.
Vous allez donc compléter le code suivant :
//compléter la méthode HTTP utilisée pour déclencher cette méthode
…………..
//spécifier le type MIME de la réponse du service
…………………………………….
//compléter le chemin
……………..
public List<Hotel> findHotelsByVille(@PathParam("ville") String ville) {
Query query = em.createNamedQuery("compléter par le nom de la requête
nommée");
query.setParameter("ville", ville); // La méthode
permet de fournir une valeur à chaque paramètre.
setParameter()
return query.getResultList();
}
o
Sauvegarder et tester le service.
4. Développement d’un service REST pour la réservation d’hôtels
Vous allez creer un service Rest pour la reservation d’un hotel. Vous allez creer une classe entite
« Reservation » dans le package ENTITE qui represente la reservation d’un hotel. Le modele de
base de donnees est decrit dans le MCD ci-dessous. Le service devra permettre de lister toutes
les reservations, ajouter une reservation, modifier une reservation et supprimer une reservation.
Il ne faut pas oublier de definir l’association entre les deux tables (annotations @OnetoMany et
ManytoOne).
a) Définition des relations entre les entités
 Il faut définir l’association entre les deux tables en définissant les annotations
@OnetoMany et ManytoOne.
Page 4
M2 SIR
2016-2017
Il faut gérer la cascade en définissant une cascade de type ALL. En effet, on souhaite que
quand on supprime un hôtel, sa réservation soit également supprimée.
b) Mapping des entités à XML grâce à JAXB
 Ajouter l’annotation JAXB @XmlRootElement pour chaque classe entité.
 Ajouter l’annotation JAXB @XmlTransient pour chaque les getters.
Développement du client
Maintenant, vous allez definir un client pour l’invocation des services de recherche d’hotels, de
geocodage et de reservation d’hotels.
a) Création d’une application client pour l’invocation du service Hôtel
Vous allez :

Creer un nouveau projet de type Java application que vous nommerez « HotelClient »
(decochez la creation de la classe main).

Générer les classes entité à partir de la base de données : NewEntity Classes from
Databases. Vous sélectionnerez la base de données HotelsBD et ajouterez les tables de la
base de données. Vous nommerez le package « ENTITE ».
Invoquer l’opération de création d’un hôtel à partir du client. Pour cela, vous allez faire
NewOtherWeb ServicesRestful Java Client. Vous nommerez la classe
« HotelCreateClient » et vous sélectionnerez la ressource REST correspondante. L'API client
de Jersey permet l'interopérabilité avec des web services Rest. Que comporte la nouvelle
classe générée ?
Ajouter une méthode main dans la classe « HotelCreateClient».


public static void main(String args[])throws UniformInterfaceException
{
HotelCreateClient
client=new
HotelCreateClient
ClientResponse response=client.findAll(ClientResponse.class);
();
GenericType<List<Hotel>> genericType = new GenericType<List<Hotel>>() {};
// Retourne un tableau d’hôtels à partir du service web
List<Hotel> data= new ArrayList<Hotel>();
data=(response.getEntity(genericType));
Hotel H=new Hotel();
//ajouter les données sur l’hôtel que vous allez insérer
H.setAdresse("…….");
p.setNomhotel("……");
…… ;
client.create(p);}


Executer la classe et verifier que l’hotel a bien ete cree.
Invoquer les autres opérations du service : recherche de tous les hôtels, recherche des
hôtels par prix, suppression d’un hôtel, etc.

Invoquer le service de géocodage de google pour déterminer les coordonnées
géographiques de vos hôtels.

Invoquer maintenant le service de Réservation pour l’ajout d’une réservation pour un
hôtel donné, l’affichage de toutes les réservations, etc.
Page 5
Téléchargement