WireMock + Recorder : mocker une API existante

Aperçu

WireMock est un outil formidable ❤ qui permet de mocker une API REST, ou tout autre service Web.

D’autres fonctionnalités bien utiles sont fournies, comme l’enregistrement du comportement d’une API à partir d’un serveur réel.

Recorder

Pour cela il va falloir utiliser le recorder fourni par WireMock. La procédure est décrite à cette page : Record and Playback.

Au préalable il faudra démarrer un serveur WireMock, en mode standalone par exemple. Supposons que le serveur tourne sur le port 8080.

Il faut ensuite se rendre à la page http://localhost:8080/__admin/recorder .

Puis on va renseigner l’URL de l’API qu’on veut mocker. Prenons par exemple l’API Star Wars : https://swapi.dev/ .

On saisit donc l’URL de l’API : https://swapi.dev/api/ . Et on clique sur « Record ».

Ensuite on va se servir de ce serveur comme d’un proxy, et il va enregistrer les requêtes et les réponses dans des fichiers locaux, pour pouvoir ensuite les reproduire sans être connecté au serveur d’origine.

Les différents endpoints utilisables de cette API sont répertoriés dans la documentation : https://swapi.dev/documentation#start.

Donc au lieu d’accéder à cette URL :

On va passer par le serveur WireMock avec :

Si on utilise curl, on lancera donc la commande :

$ curl -i -s -X GET http://localhost:8080/people/1/

HTTP/2 200
server: nginx/1.16.1
date: Fri, 03 Feb 2023 21:00:12 GMT
content-type: application/json
vary: Accept, Cookie
x-frame-options: SAMEORIGIN
etag: "ee398610435c328f4d0a4e1b0d2f7bbc"
allow: GET, HEAD, OPTIONS
strict-transport-security: max-age=15768000

{"name":"Luke Skywalker","height":"172","mass":"77","hair_color":"blond","skin_color":"fair","eye_color":"blue","birth_year":"19BBY","gender":"male","homeworld":"https://swapi.dev/api/planets/1/","films":["https://swapi.dev/api/films/1/","https://swapi.dev/api/films/2/","https://swapi.dev/api/films/3/","https://swapi.dev/api/films/6/"],"species":[],"vehicles":["https://swapi.dev/api/vehicles/14/","https://swapi.dev/api/vehicles/30/"],"starships":["https://swapi.dev/api/starships/12/","https://swapi.dev/api/starships/22/"],"created":"2014-12-09T13:50:51.644000Z","edited":"2014-12-20T21:17:56.891000Z","url":"https://swapi.dev/api/people/1/"}

Vous pouvez en profiter pour tester d’autres URL pour enregistrer davantage de mappings, comme :

Quand vous avez terminé, cliquez sur « Stop ».

Des fichiers JSON ont été créés dans le répertoire mappings. On peut les retrouver à cette URL : http://localhost:8080/__admin/mappings .

Le premier mapping va donc générer un fichier mappings/people_1-989db380-8a58-4c35-a8d6-ac709f14b773.json, avec le contenu :

{
  "id" : "989db380-8a58-4c35-a8d6-ac709f14b773",
  "name" : "people_1",
  "request" : {
    "url" : "/people/1/",
    "method" : "GET"
  },
  "response" : {
    "status" : 200,
    "body" : "{\"name\":\"Luke Skywalker\",\"height\":\"172\",\"mass\":\"77\",\"hair_color\":\"blond\",\"skin_color\":\"fair\",\"eye_color\":\"blue\",\"birth_year\":\"19BBY\",\"gender\":\"male\",\"homeworld\":\"https://swapi.dev/api/planets/1/\",\"films\":[\"https://swapi.dev/api/films/1/\",\"https://swapi.dev/api/films/2/\",\"https://swapi.dev/api/films/3/\",\"https://swapi.dev/api/films/6/\"],\"species\":[],\"vehicles\":[\"https://swapi.dev/api/vehicles/14/\",\"https://swapi.dev/api/vehicles/30/\"],\"starships\":[\"https://swapi.dev/api/starships/12/\",\"https://swapi.dev/api/starships/22/\"],\"created\":\"2014-12-09T13:50:51.644000Z\",\"edited\":\"2014-12-20T21:17:56.891000Z\",\"url\":\"https://swapi.dev/api/people/1/\"}",
    "headers" : {
      "Server" : "nginx/1.16.1",
      "Date" : "Fri, 03 Feb 2023 21:25:47 GMT",
      "Content-Type" : "application/json",
      "Vary" : "Accept, Cookie",
      "X-Frame-Options" : "SAMEORIGIN",
      "ETag" : "\"ee398610435c328f4d0a4e1b0d2f7bbc\"",
      "Allow" : "GET, HEAD, OPTIONS",
      "Strict-Transport-Security" : "max-age=15768000"
    }
  },
  "uuid" : "989db380-8a58-4c35-a8d6-ac709f14b773",
  "persistent" : true,
  "insertionIndex" : 7
}

Et voilà, à chaque fois qu’on exécutera la requête GET sur http://localhost:8080/people/1/, le serveur WireMock répondra avec la réponse HTTP enregistrée comme ci-dessus.