Introduction à Spring REST Shell

Introduction à Shell REST Spring

1. Vue d'ensemble

Dans cet article, nous allons examiner Spring REST Shell et certaines de ses fonctionnalités.

Il s’agit d’une extension Spring Shell, nous vous recommandons donc de commencer par lireabout it.

2. introduction

Spring REST Shell est un shell de ligne de commande conçu pour faciliter l'utilisation des ressources REST compatibles Spring HATEOAS.

Nous n'avons plus besoin de manipuler les URL dans bash en utilisant des outils tels quecurl. Spring REST Shell fournit un moyen plus pratique d'interagir avec les ressources REST.

3. Installation

Si nous utilisons une machine macOS avec Homebrew, nous pouvons simplement exécuter la commande suivante:

brew install rest-shell

Pour les utilisateurs d'autres systèmes d'exploitation, nous devons télécharger un package binaire à partir dethe official GitHub project page, décompresser le package et trouver un exécutable à exécuter:

tar -zxvf rest-shell-1.2.0.RELEASE.tar.gz
cd rest-shell-1.2.0.RELEASE
bin/rest-shell

Une autre option consiste à télécharger le code source et à exécuter une tâche Gradle:

git clone git://github.com/spring-projects/rest-shell.git
cd rest-shell
./gradlew installApp
cd build/install/rest-shell-1.2.0.RELEASE
bin/rest-shell

Si tout est correctement configuré, nous verrons le message d'accueil suivant:

 ___ ___  __ _____  __  _  _     _ _  __
| _ \ __/' _/_   _/' _/| || |   / / | \ \
| v / _|`._`. | | `._`.| >< |  / / /   > >
|_|_\___|___/ |_| |___/|_||_| |_/_/   /_/
1.2.1.RELEASE

Welcome to the REST shell. For assistance hit TAB or type "help".
http://localhost:8080:>

4. Commencer

Nous travaillerons avec les APIalready developed for another article. Lelocalhost:8080 est utilisé comme URL de base.

Voici une liste des points de terminaison exposés:

  • GET/articles - récupère tous lesArticles

  • GET/articles/{id} - obtenir unArticle par id

  • GET/articles/search/findByTitle?title={title} - obtenir unArticle par titre

  • GET / profile / articles - récupère les données de profil pour une ressourceArticle

  • POST/articles - crée un nouveauArticle avec un corps fourni

La classeArticle a trois champs:id, title, etcontent.

4.1. Créer de nouvelles ressources

Ajoutons un nouvel article. Nous allons utiliserthe post command passing a JSON String with the –data parameter.

Tout d'abord, nous devonsfollow l'URL associée à la ressource que nous voulons ajouter. La commandefollow prend un URI relatif, le concatène avec lesbaseUri et définit le résultat comme l'emplacement actuel:

http://localhost:8080:> follow articles
http://localhost:8080/articles:> post --data "{title: "First Article"}"

Le résultat de l'exécution de la commande sera:

< 201 CREATED
< Location: http://localhost:8080/articles/1
< Content-Type: application/hal+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 29 Oct 2017 23:04:43 GMT
<
{
  "title" : "First Article",
  "content" : null,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/articles/1"
    },
    "article" : {
      "href" : "http://localhost:8080/articles/1"
    }
  }
}

4.2. Découvrir les ressources

Maintenant, lorsque nous avons des ressources, découvrons-les. Nous allons utiliserthe discover command which reveals all available resources at the current URI:

http://localhost:8080/articles:> discover

rel        href
=================================================
self       http://localhost:8080/articles/
profile    http://localhost:8080/profile/articles
article    http://localhost:8080/articles/1

Connaissant l'URI de la ressource, nous pouvons le récupérer en utilisant la commandeget:

http://localhost:8080/articles:> get 1

> GET http://localhost:8080/articles/1

< 200 OK
< Content-Type: application/hal+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 29 Oct 2017 23:25:36 GMT
<
{
  "title" : "First Article",
  "content" : null,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/articles/1"
    },
    "article" : {
      "href" : "http://localhost:8080/articles/1"
    }
  }
}

4.3. Ajout de paramètres de requête

Nous pouvons spécifier des paramètres de requête en tant que fragments JSON à l'aide du paramètre–params.

Prenons un article du titre donné:

http://localhost:8080/articles:> get search/findByTitle \
> --params "{title: "First Article"}"

> GET http://localhost:8080/articles/search/findByTitle?title=First+Article

< 200 OK
< Content-Type: application/hal+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 29 Oct 2017 23:39:39 GMT
<
{
  "title" : "First Article",
  "content" : null,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/articles/1"
    },
    "article" : {
      "href" : "http://localhost:8080/articles/1"
    }
  }
}

4.4. Définition des en-têtes

The command called headers allows managing headers within the session scope - chaque demande sera envoyée en utilisant ces en-têtes. Leheaders set prend les arguments–name et–value pour déterminer un en-tête.

Nous allons ajouter quelques en-têtes et faire une demande comprenant ces en-têtes:

http://localhost:8080/articles:>
  headers set --name Accept --value application/json

{
  "Accept" : "application/json"
}

http://localhost:8080/articles:>
  headers set --name Content-Type --value application/json

{
  "Accept" : "application/json",
  "Content-Type" : "application/json"
}

http://localhost:8080/articles:> get 1

> GET http://localhost:8080/articles/1
> Accept: application/json
> Content-Type: application/json

4.5. Écriture des résultats dans un fichier

Il n’est pas toujours souhaitable d’imprimer les résultats d’une requête HTTP à l’écran. Sometimes, we need to save the results in a file for further analysis.

Le paramètre–output permet d'effectuer de telles opérations:

http://localhost:8080/articles:> get search/findByTitle \
> --params "{title: "First Article"}" \
> --output first_article.txt

>> first_article.txt

4.6. Lire JSON à partir d'un fichier

Souvent, les données JSON sont trop volumineuses ou trop complexes pour être saisies via la console à l'aide du paramètre–data.

En outre, le format des données JSON pouvant être entrées directement dans la ligne de commande est limité.

Le paramètre–from donne la possibilité de lire des données à partir d'un fichier ou d'un répertoire.

Si la valeur est un répertoire, le shell lira chaque fichier qui se termine par“.json” et effectuera un POST ou PUT avec le contenu de ce fichier.

Si le paramètre est un fichier, le shell chargera le fichier et les données POST / PUT à partir de ce fichier.

Créons l'article suivant à partir du fichiersecond_article.txt:

http://localhost:8080/articles:> post --from second_article.txt

1 files uploaded to the server using POST

4.7. Définition des variables de contexte

Nous pouvons également définir des variables dans le contexte de la session en cours. The command var defines the get and set parameters for getting and setting a variable respectively.

Par analogie avec lesheaders, les arguments–name et–value servent à donner le nom et la valeur d'une nouvelle variable:

http://localhost:8080:> var set --name articlesURI --value articles
http://localhost:8080/articles:> var get --name articlesURI

articles

Nous allons maintenant imprimer une liste des variables actuellement disponibles dans le contexte:

http://localhost:8080:> var list

{
  "articlesURI" : "articles"
}

Après nous être assurés que notre variable a été enregistrée, nous allons l'utiliser avec la commandefollow pour basculer vers l'URI donné:

http://localhost:8080:> follow #{articlesURI}
http://localhost:8080/articles:>

4.8. Affichage de l'historique

Tous les chemins que nous visitons sont enregistrés. The command history shows these paths in the chronological order:

http://localhost:8080:> history list

1: http://localhost:8080/articles
2: http://localhost:8080

Chaque URI est associé à un numéro pouvant être utilisé pour accéder à cet URI:

http://localhost:8080:> history go 1
http://localhost:8080/articles:>

5. Conclusion

Dans ce didacticiel, nous nous sommes concentrés sur un outil intéressant et rare dans l'écosystème Spring: un outil de ligne de commande.

Vous pouvez trouver plus d'informations sur le projetover on GitHub.

Et, comme toujours, tous les extraits de code mentionnés dans l'article se trouvent dansour repository.