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 ServicesGoogleGeocoding 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 NewRestful 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 projetdeploy) 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 : NewEntity 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 NewOtherWeb ServicesRestful 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