TP Web Service
S. Salva

Google App Engine


1. API nécessaires

Google Cloud SDK
Google Cloud plugin pour Eclipse si vous voulez utiliser un IDE
Jeysey API

2. Installation de l'environnement

A

Le Google Cloud SDK (lib) est déjà téléchargé et disponible. Vous pouvez l'utiliser en ligne de commande (gcloud...)

Téléchargez le SDK jersey ici

Ajouter le pluggin Google pour Eclipse via le Market place. Voir ici

Ajouter le serveur Jetty via le Market place.

Authentifiez vous à GAE dans Eclipse avec login:iut.info63@gmail.com, pass:info63000

J'ai crée 13 applications info63appXX (0 à 12), voir dans la console. Choisissez en une (non choisie par quelqu'un d'autre...)

3. Développement d'un service Web Jersey sur GAE


A

Utilisez l'IDE Eclipse, je vous conseille d'utiliser un nouveau Workspace et de supprimer le répertoire.eclipse dans votre compte.

Créez un projet Google Standard Java project. Dans les options de la création de projet, cochez l'utilisation de Maven et ajoutez la librairie app engine.

nvx projet

Le choix de l'id de l'application pour le deploiement sur GAE, l peut se faire maintenant ou au moment du déploiement. L'id est: info63appXX

Notez qu'il y a une version par application qui peut être changée

choix ID

choix ID2

B

Créez un service Web avec la librairie Jersey de type HelloWorld qui retour une simple chaine. (Il faut faire New Java/Class).

Modifez le pom.xml pour :

Ajouter les dépendances de Jersey:

<!-- Jersey 2.19 -->

 <dependency>

            <groupId>javax.ws.rs</groupId>

            <artifactId>javax.ws.rs-api</artifactId>

            <version>2.0.1</version>

        </dependency>

        <dependency>

            <groupId>org.glassfish.jersey.containers</groupId>

            <artifactId>jersey-container-servlet</artifactId>

            <version>2.19</version>

        </dependency>

        <dependency>

            <groupId>org.glassfish.jersey.core</groupId>

            <artifactId>jersey-server</artifactId>

            <version>2.19</version>

        </dependency>

        <dependency>

            <groupId>org.glassfish.jersey.core</groupId>

            <artifactId>jersey-client</artifactId>

            <version>2.19</version>

        </dependency>


Ajouter la dépendance de persistence :

<!-- persistence -->

         <dependency>

        <groupId>org.eclipse.persistence</groupId>

        <artifactId>javax.persistence</artifactId>

        <version>2.2.1</version>

    </dependency>

    <dependency>

        <groupId>org.eclipse.persistence</groupId>

        <artifactId>org.eclipse.persistence.jpa</artifactId>

        <version>2.7.3</version>

    </dependency>

    <dependency>

        <groupId>javax</groupId>

        <artifactId>javaee-web-api</artifactId>

        <version>7.0</version>

        <scope>provided</scope>

    </dependency>

   

Ajouter la dépendance JaxB pour la sérialisation:

<!-- JAXB -->

    <dependency>

    <groupId>javax.xml.bind</groupId>

    <artifactId>jaxb-api</artifactId>

    <version>2.2.11</version>

</dependency>

<dependency>

    <groupId>com.sun.xml.bind</groupId>

    <artifactId>jaxb-core</artifactId>

    <version>2.2.11</version>

</dependency>

<dependency>

    <groupId>com.sun.xml.bind</groupId>

    <artifactId>jaxb-impl</artifactId>

    <version>2.2.11</version>

</dependency>

<dependency>

    <groupId>javax.activation</groupId>

    <artifactId>activation</artifactId>

    <version>1.1.1</version>

</dependency> 

          

C

Modifiez manuellement le fichier web.xml pour prendre le conteneur Jersey et modifier l'URL d'accès (voir cours)

Testez localement (click droit sur le projet, RunAs Jetty). Notez pour chez vous que je n'ai pas réussi à faire fonctionner le serveur Appengine avec Java 13. Mais avec Java 8 (11?) le serveur devrait fonctionner. Jetty n'est donc pas nécessaire dans ce cas.

Appelez directement votre ressource et non pas juste http://localhost:8080

runas

D

Déployez sur GAE et testez votre service via un navigateur.

Vous pouvez affichier les logs en console. faites:

gcloud config set project id_projet

gcloud app logs tail -s default

Si vous avez une erreur décrivant un pb d'authentification, allez sur une console et faites gcloud auth application-default login

4. Utilisation du Datastore

A

Faites un service Web qui permet

  1. d'ajouter des employés (nom, prenom passés en paramêtre)
  2. de lister les employés par nom (retour HTML)


La solution qui semble la plus adéuate est d'utiliser la librairie Objectify. Voir ici

  1. Créez un nouveau projet comme précédemment et maintenant cochez la librairie Objectify sur la page du nouveau projet.
  2. Développez un service permettant d'ajouter et de récupérer des employés. Pensez à la gestion des erreurs.
  3. Pour que votre service fonctionne avec le Datasore, voir l'installation de la V6: vous devez créer un service listener. Il devrait étre créer dans le projet (pas le cas il y a quelques mois) avec  les fichier ObjectifyWebFilter  et ObjectifyWebListener
  4. Dans ObjectifyWebListener enregistrez vos entités. Par exemple; ObjectifyService.register(p.Employee.class);


Vérifiez bien votre code et deployez sur GAE pour tester. Vérifiez également que le datastore est modifié via la console d'admin de GAE (https://console.cloud.google.com/).

Pour les plus fous, optionnel: vous pouvez tenter de tester en local (un datastore local conecté avec objectify. voir la page d'installation)

B

Implémentez le même service en utilisant la librairie bas niveau du Datastore. (Reprenez le code qui se trouve dans le cours permettant le stockage et la recherche de données dans le Datastore par Entity).

Pour utiliser le Datastore, il nous faut une lib supplémentaire. Simplifions nous la vie (a voir) en créant un nouveau projet se basant sur Maven (gestionnaire de projet et de dépendances). Regardez bien à la création du projet :)

Ajoutez google-cloud-datastore et jersey-client (comme dessous)

pom2

pom

ou bien modifiez le pom.xml directement . Le numéro de version se trouve ici : maven datastore


Pensez à la gestion des erreurs.
Le SDK propose une Exception DatastoreException.

Testez votre service localement, (notez qu'il utilisera le vrai Datastore de GAE) en utilisant un navigateur. Vérifiez également que le datastore est modifié via la console d'admin de GAE (https://console.cloud.google.com/).


C

Déployez sur GAE et testez.

5. Utilisation du Blobstore

Utilisons le blobstore pour stoker des images.

A

Créez un projet GAE, puis une JSP index.jsp contenant le formulaire d'upload. Ce formulaire doit rediriger vers un upload handler qui sera  votre service Web (URL du type  /rest/exo/upload).

B

Créez un service Web Rest avec deux méthodes:
  1. une méthode nommée upload qui doit être appelée par la JSP précédente et retourner la clée du fichier stocké
  2. une méthode déclarée par @Path("lecture/{clee}") qui retourne un fichier image.
Aide:
retournez une image avec @Produces("image/png")
pour récupérer les objets  HttpServletRequest et HttpServletResponse, ajouter en paramètre de méthode: @Context HttpServletRequest req, @Context HttpServletResponse res

C

Testez localement (sans déployer). Pour vérifier que votre image est stockée, utilisez http://localhost:8888/_ah/admin 
blob

Puis rappelez votre  service avec  l'URL  /lecture/clee pour afficher dans votre navigateur l'image.

D

Testez sous GAE

6. Gestion compte Utilisateur

Cette partie est gérée par Google. Il faut que votre application soit paramétrée pour authoriser l'authentification par Google account (par défaut).


A

Je vous demande de créer un service Rest qui redirige vers une JSP permettant de se connecter si le client n'est pas connecter ou vers une JSP affichant des informations utilisateur et de se deconnecter.

Je vous donne les JSP ici.
Implantez le service Rest et testez en local

Ca devrait vous donner une image de connection de ce genre:

loggin

Déployez et testez sur GAE
ca vous donne ça:

loggin