Outils pour utilisateurs

Outils du site


informatique:rss:simulation_de_flux

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:rss:simulation_de_flux [2024/11/24 03:57] – supprimée - modification externe (Date inconnue) 127.0.0.1informatique:rss:simulation_de_flux [2024/11/24 03:58] (Version actuelle) alexis
Ligne 1: Ligne 1:
 +====== Simulation de flux RSS pour FreshRSS =======
  
 +FreshRSS est un agrégateur de flux RSS.
 +Il permet de regrouper au même endroit les articles proposés en scannant périodiquement les données mises à disposition par les sites.
 +C'est très pratique car cela évite de devoir faire cela manuellement.
 +Mais lors du développement de la solution ou lors de tests, cette fonctionnalité devient génante car les données changent.
 +C'est pourquoi simuler les flux RSS dans ces conditions devient nécessaire.
 +
 +Pour cela, nous allons utiliser un serveur de « //mocks// » qui nous servira des contenus prédéfinis.
 +Ici, nous allons utiliser [[https://wiremock.org/|WireMock]] mais il existe d'autres solutions disponibles.
 +
 +==== Mise en place de l'arborescence ====
 +Dans le répertoire de travail de WireMock, il faut créer les répertoires //%%__%%files// et //mappings// avec la commande suivante :
 +
 +<WRAP prewrap>
 +<code bash>
 +mkdir __files mappings
 +</code>
 +</WRAP>
 +
 +Le répertoire //%%__%%files// contiendra les fichiers de données des flux RSS tandis que le répertoire //mappings// contiendra les fichiers de correspondance entre les requêtes reçues et les réponses retournées.
 +
 +<WRAP alert>
 +Ces répertoires doivent être créés avec les permissions utilisées par le conteneur de Wiremock.
 +Si ce n'est pas le cas, les fichiers pourraient ne pas être accessibles depuis le réseau interne.
 +Pour éviter cela, il suffit de démarrer le conteneur de Wiremock.
 +Celui-ci se chargera de créer les répertoires manquants.
 +</WRAP>
 +
 +==== Récupération des données des flux RSS ====
 +Il existe plusieurs méthodes pour récupérer les données d'un flux RSS. Ici, nous allons utiliser //wget// avec la commande suivante :
 +<WRAP prewrap>
 +<code bash>
 +# Version courte
 +wget https://reddit.com/r/breadit/new/.rss -O breadit.rss
 +
 +# Version longue
 +wget https://reddit.com/r/breadit/new/.rss --output-document breadit.rss
 +</code>
 +</WRAP>
 +  * ''%%-O%%'' ou ''%%--output-document%%'' permet de nommer le fichier téléchargé.
 +
 +<WRAP info>
 +Pour que cela fonctionne correctement, il faudra soit directement télécharger le fichier dans le répertoire //%%__%%files// soit l'y déplacer une fois téléchargé.
 +</WRAP>
 +
 +==== Configuration statique ====
 +Maintenant que nous avons nos données, il faut dire à WireMock comment les restituer.
 +Pour cela, nous allons créer un fichier de configuration dans le répertoire //mappings//.
 +Son nom n'a pas d'importance mais il doit posséder l'extension **json** et contenir du JSON valide.
 +Nous allons créer le fichier //breadit.json// avec le contenu suivant :
 +<WRAP prewrap>
 +<code javascript>
 +{
 + "request": {
 + "method": "GET",
 + "url": "/breadit.rss"
 + },
 + "response": {
 + "status": 200,
 + "bodyFileName": "breadit.rss",
 + "headers": {
 + "Content-Type": "application/rss+xml"
 + }
 + }
 +}
 +</code>
 +</WRAP>
 +Ce fichier indique à WireMock de retourner le contenu du fichier précédemment téléchargé lors d'un appel GET sur l'URL définie.
 +
 +<WRAP info>
 +Il faudra créer un fichier de configuration pour chaque fichier de données téléchargé.
 +Pour 1 ou 2 fichiers, la tâche n'est pas trop importante mais nous allons vite nous rendre compte que ce n'est pas soutenable si le nombre de fichiers augmente sérieusement.
 +C'est pour cela qu'il vaut mieux utiliser une configuration dynamique comme décrite plus bas.
 +</WRAP>
 +
 +
 +==== Configuration dynamique ====
 +Pour traiter de nombreux messages, il vaut mieux opter pour une configuration dynamique.
 +Nous allons donc créer le fichier //feed.json// dans le répertoire //mapping// avec le contenu suivant :
 +<WRAP prewrap>
 +<code javascript>
 +{
 + "request": {
 + "method": "GET",
 + "urlPathPattern": "/.*"
 + },
 + "response": {
 + "status": 200,
 + "bodyFileName": "{{request.pathSegments.[0]}}",
 + "transformers": ["response-template"],
 + "headers": {
 + "Content-Type": "application/rss+xml"
 + }
 + }
 +}
 +</code>
 +</WRAP>
 +Voici ce qui change par rapport à la précédente configuration :
 +  * WireMock ne surveille pas une URL en particulier mais toutes les URLs qui ont le même format que celui décrit ((Ici, toutes les URLs sont traitées)).
 +  * Le nom du fichier à retourner est directement extrait de la requête. Il est ajouté dans le modèle de réponse.
 +  * L'utilisation d'un système de modèle de réponse ((Sans ce transformateur, la configuration de //bodyFileName// est inutile car elle ne sera pas interprétée comme un modèle de réponse)).
 +
 +<WRAP important>
 +Le système de modèle de réponse ne fait pas partie intégrante de WireMock, c'est une extension.
 +Il faudra donc la charger lors du démarrage pour pouvoir en profiter.
 +</WRAP>
 +
 +==== Lancement de WireMock ====
 +<WRAP prewrap>
 +<code bash>
 +# Version courte pour configuration statique
 +docker run -it --rm -p 9090:8080 --name wiremock --network freshrss-network -v $PWD:/home/wiremock wiremock/wiremock:latest-alpine
 +
 +# Version longue pour configuration statique
 +docker run --interactive --tty --rm --publish 9090:8080 --name wiremock --network freshrss-network --volume $PWD:/home/wiremock wiremock/wiremock:latest-alpine
 +
 +# Version courte pour configuration dynamique
 +docker run -it --rm -p 9090:8080 --name wiremock --network freshrss-network -v $PWD:/home/wiremock wiremock/wiremock:latest-alpine --local-response-templating
 +
 +# Version longue pour configuration dynamique
 +docker run --interactive --tty --rm --publish 9090:8080 --name wiremock --network freshrss-network --volume $PWD:/home/wiremock wiremock/wiremock:latest-alpine --local-response-templating
 +</code>
 +</WRAP>
 +  * ''%%-i%%'' ou ''%%--interactive%%'' permet de garder l'entrée standard ouverte.
 +  * ''%%-t%%'' ou ''%%--tty%%'' permet l'allocation d'un pseudo-TTY.
 +  * ''%%--rm%%'' supprime automatiquement le conteneur lors de sa fermeture.
 +  * ''%%-p%%'' ou ''%%--publish%%'' permet de lier les ports du conteneur avec ceux de l'hôte.
 +  * ''%%--name%%'' nomme le conteneur.
 +  * ''%%--network%%'' permet de lier le conteneur à un réseau existant.
 +  * ''%%-v%%'' ou ''%%--volume%%'' permet de monter un répertoire local dans le conteneur.
 +  * ''%%--local-response-templating%%'' permet d'utiliser localement l'extension //ResponseTemplateTransformer// qui met en forme la réponse envoyée grace à un système de modèles. ((Utile uniquement lors de l'utilisation de configurations dynamiques)) ((Ce n'est pas une option de docker, c'est un argument de la commande utilisée dans le conteneur.))
 +
 +<WRAP important>
 +Lors de l'utilisation avec configuration dynamique, il est important de charger l'extension appropriée.
 +Si ce n'est pas le cas, cela ne fonctionnera pas.
 +</WRAP>
 +
 +==== Utilisation des données ====
 +Maintenant que notre conteneur est lancé, il est possible d'accéder aux données :
 +  * soit depuis un autre conteneur connecté au même réseau avec l'URL ''http://wiremock:8080/breadit.rss'' ((Utilisé quand le système de développement est dans un autre conteneur)),
 +  * soit depuis l'hôte avec l'URL ''http://localhost:9090/breadit.rss'' ((Utilisé quand le système de développement est sur le système hôte)).
 +
 +==== Mise à jour des configurations ====
 +
 +Pour mettre à jour les configurations, il faut :
 +  * soit redémarrer le conteneur,
 +  * soit envoyer une requête //POST// à l'URL ''__admin/mappings/reset''.
 +==== Liens ====
 +  * [[https://wiremock.org/docs/docker/|Configuring and running WireMock in Docker | WireMock]]
 +  * [[https://stackoverflow.com/questions/63532189/docker-container-with-wiremock-does-not-refresh-changes-from-volume|Docker Container with Wiremock does not refresh changes from volume - Stack Overflow]]
 +  * [[https://wiremock.org/docs/extending-wiremock/|Extending WireMock via custom code | WireMock]]
 +  * [[https://wiremock.org/docs/response-templating/#the-request-model|Response Templating | WireMock]]
 +  * [[https://wiremock.org/docs/stubbing/|Returning stubbed HTTP responses to specific requests | WireMock]]
 +  * [[https://www.wizzairprices.com/blog/java/testing/wiremock/wiremock-extracting-data-from-request-body.html|Wiremock - Mock a response body depending on a request body - R{}zky Notes]]
 +  * [[https://hub.docker.com/r/wiremock/wiremock|wiremock/wiremock - Docker Image | Docker Hub]]