TP Web Service
S. Salva

Google App Engine


1. Outils

Vous préférez utiliser un IDE (Eclipse)? alors allez là


  • Maven
  • Installez Google Cloud SDK. Vous l'utilisez en ligne de commande (gcloud...) Google Cloud plugin pour Eclipse si vous voulez utiliser un IDE

  • Vous pouvez utiliser votre propre compte Google.
  • J'ai aussi crée un compte (login:iut.info63@gmail.com, pass:info63000) et 13 applications: inf63appXX (0 à 12), voir dans la console. Choisissez en une (non choisie par quelqu'un d'autre...)

  • 2. Développement d'un service Web  sur GAE

    A

    Je vous conseille d'utiliser Maven en ligne de commande. A vous de voir si vous préférez utiliser un IDE. Un peu de doc ici

    Pour choisir un projet, en console faites:

    gcloud components update

    gcloud auth login

    gcloud config set project **YOUR_PROJECT_ID**

    Ensuite, les étapes sont les suivantes:

  • Créer un projet Springboot avec maven (TP2)
  • Complétez le pom.xml pour mettre en place le déploiement sur AppEngine avec :
  • <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>appengine-maven-plugin</artifactId>
            <version>2.4.0</version>
            <configuration>
              <version>1</version>
              <projectId>GCLOUD_CONFIG</projectId>
            </configuration>
          </plugin>
  • Faites mvn clean package pour récupérer vos lib

  • Développez un premier service simple type HelloWorld avec une méthode de type GET et POST
  • Ajoutez le fichier de déploiement app.yaml dans le répertoire src/main/appengine. Ce fichier contient (voir doc):
  • runtime: java11
    instance_class: F1

    Pour lancer votre service en local : mvn  spring-boot:run

    Pour le déployer sur GAE, faites : mvn -DskipTests package appengine:deploy.

    L'option -DskipTests permet de ne pas lancer les tests (très pratique notamment si vous utilisez des Lib/Bd du cloud).

    Vous avez également les options   -Dapp.deploy.projectId=info63app0 -Dapp.deploy.version=1 pour cibler une application et une version.

    Vous pouvez affichier les logs en console. faites:

    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

    B

    Dans le même projet, faites un second service de gestion (fictive) de livres avec une entity Book et une sérialisation Json. (Voir TP précédent)

    Vous aurez certainement besoin de la dépendance JaxB pour la sérialisation:

    <!-- JAXB -->

        <dependency>

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

        <artifactId>jaxb-api</artifactId>

        <version>2.3.0</version>

    </dependency>


    et celles là eventuellement (pour xml, mais json non)


    <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> 

             

    3. Client Springboot

    Créez un Client pour ce sdernier ervice avec Springboot.


    4. Création d'un client Guzzle

    Guzzle est un framework PHP de génération de clients HTTP basé sur Curl. Il est possible de faire appel à toutes les méthodes HTTP bien sûr. Il permet également de décortiquer les requètes/réponses quelles soient en HTML, JSON, ou XML.

    DOC

    Voici un exemple basique:

    require 'guzzle.phar';

    // Create a client for http://localhost (binding to a host is optional)

    $client = new GuzzleHttp\Client();
    $res = $client->request('GET', 'http://localhost:8080/Projet/webresrouces/wsrest/meth'
    ]);
    echo $res->getStatusCode();
    
    echo $res->getHeader('content-type')[0];
    // 'application/json; charset=utf8'
    echo $res->getBody();
    

    $client->request('PUT', '/put', ['body' => 'foo']);
    ?>