Analyse d'intégration des technologies web services dans un système distribué pour l'authentification et le suivi permanent des étudiants.par Daniel Kavale Université Révérend Kim - Licence en Conception des systèmes d'information et Gestion des Bases des données 2020 |
IV.4.3. Déploiement du Service WebMaintenant que nos services web sont créés, nous allons passer au déploiement de notre application ou à sa publication. Pour ce faire, il suffit de se positionner sur le noeud « Restful Web services » et faire un clic droit puis sélectionner Test Restful web services. Comme nos configurations sur les figures précédentes étaient basées sur le serveur GlassFish, notre application sera déployée sur ce denier. Figure IV.17. Test et déploiement des services Web Restful 55 Etant donné que le test se fait en local, les services web publiés seront visualisés via un navigateur web où ils peuvent également être testés. Dans notre cas ici, nous le ferons à l'aide de Google chrome, et nous y voilà : Figure IV.18. Présentation des services publiés Cette interface représente en tout ce que nous avons appelé plus haut annuaire des services, il contient les services publiés et leurs descriptions. Les services sont déployés ou publiés grâce au protocole http comme nous pouvons le voir dans la barre d'url de notre navigateur. Remarque : Au début du corps de notre page web se situe un label WADL qui signifie Web Application Definition Language, il décrit les ressources fournies par le service, comment les utiliser et les relations qui existent entre elles. Dans notre test, il se presente comme suit : http://!oca!host:8080/MomMemoire/webresources/app!ication.wad! C'est l'équivalent du WSDL de services web basé sur le protocole SOAP. En cliquant dessus, il nous présente les descriptions suivantes : Figure IV.19. Description de quelques services dans notre wadl Maintenant que nous avons fini l'implémentation et le déploiement des services web, Analysons quelques codes générés qui nous intéressent : Pour chaque classe entité, l'IDE nous génère une classe façade correspondante. Étudions la classe EtudiantFacadeREST.java : EtudiantFacadeREST.java @Stateless @Path("gestcurcis.etudiant") public class EtudiantFacadeREST extends AbstractFacade<Etudiant> { @PersistenceContext(unitName = "GestCursusPU") private EntityManager em; private EtudiantPK getPrimaryKey(PathSegment pathSegment) { gestcurcis.EtudiantPK key = new gestcurcis.EtudiantPK(); javax.ws.rs.core.MultivaluedMap<String, String> map = pathSegment.getMatrixParameters(); java.util.List<String> idEtud = map.get("idEtud"); if (idEtud != null && !idEtud.isEmpty()) { key.setIdEtud(new java.lang.Integer(idEtud.get(0))); } java.util.List<String> matricule = map.get("matricule"); if (matricule != null && !matricule.isEmpty()) { key.setMatricule(matricule.get(0)); } } 56 return key; 57 public EtudiantFacadeREST() { super(Etudiant.class); } @POST @Override @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public void create(Etudiant entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public void edit(@PathParam("id") PathSegment id, Etudiant entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") PathSegment id) { gestcurcis.EtudiantPK key = getPrimaryKey(id); super.remove(super.find(key)); } @GET @Path("{id}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Etudiant find(@PathParam("id") PathSegment id) { gestcurcis.EtudiantPK key = getPrimaryKey(id); return super.find(key); } @GET @Override @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public List<Etudiant> findAll() { return super.findAll(); } 58 @GET @Path("{from}/{to}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public List<Etudiant> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); } @GET @Path("count") @Produces(MediaType.TEXT_PLAIN) public String countREST() { return String.valueOf(super.count()); } @Override protected EntityManager getEntityManager() { return em; } } ? L'annotation @Stateless indique que la classe est une « statelass session bean », en d'autre mot la classe est un servie. Comme nous l'avons défini, un service n'a pas d'état, il referme des fonctions, ... ? L'annotation @Path permet de définir l'URI dont la classe va se servir pour les requêtes. Comme on peut le remarquer, plusieurs méthodes de cette classe sont annotées par les annotations : @POST, @PUT, @DELETE et @GET. Ces méthodes seront automatiquement invoquées quand notre service Web répondra à une requête HTTP. Notons par ailleurs que plusieurs des méthodes sont aussi annotées par l'annotation @Path, la raison est que certaines d'entre elles auront besoin de recevoir un paramètre. Sur la figure qui va suivre nous allons, nous allons voir une portion de résultat de l'invocation du service etudiant par l'adresse : http://localhost:8080/MomMemoire/webresources/memoire.etudiant Figure IV.20. Résultat de l'uri du service étudiant |
|