Tester des API HTTP (.lnh)

Fichier → Nouveau → Nouveau test d'API ouvre un client HTTP enregistré dans un fichier .lnh. Un fichier représente un endpoint (méthode, URL, en-têtes et corps) et garde plusieurs tests dans la liste à gauche — chaque test avec ses valeurs pour les variables {nom} utilisées dans l'URL, les en-têtes et le corps, plus le résultat de la dernière exécution (statut, temps, date, en-têtes et corps de la réponse). Il affiche aussi la commande curl équivalente. La même opération ponctuelle est disponible via la CLI (http) et le MCP (http_request). Le testeur utilise curl, fourni avec Windows 10 et 11 ; s'il manque, LightNote ouvre le guide d'installation avant l'envoi.

Envoyer et lire la réponse

Ctrl+Entrée envoie la requête. Tant que la réponse n'est pas revenue, le même bouton devient Arrêter (ou Échap) et l'attente affiche les secondes. Le badge de la réponse indique le statut et la durée ; à côté viennent le type, la taille et le moment où le test a été exécuté. La ligne curl suit ce que vous tapez, déjà avec les variables du test sélectionné : le bouton à côté copie la commande, et sa flèche propose la même chose en PowerShell, Python, JavaScript, C# et HTTPie. Coller une commande curl directement dans l'URL importe la méthode, les en-têtes et le corps sans effacer les tests.

Une variable sans valeur dans le test est envoyée telle quelle ({id} dans l'URL, et le serveur répond par une erreur qui ne dit pas pourquoi) : l'onglet Variables la met en évidence et la nomme. Le point à côté de chaque test dans la liste a la couleur du dernier statut, et l'anneau vide est un test pas encore exécuté. Dans la réponse, la barre au-dessus du corps formate le JSON/XML à l'écran seulement, renvoie les lignes à la ligne, copie le corps et l'enregistre dans un fichier tel qu'il est arrivé.

Construire la requête. L’onglet Paramètres présente la query de l’URL sous forme de liste : modifier une ligne change l’URL, et modifier l’URL change la liste. L’onglet Authentification construit l’en-tête pour vous — Basic, Bearer ou Clé d’API, dans un en-tête ou dans l’URL — et chaque champ accepte une {variable}, pour que le secret vive dans l’environnement et pas dans le fichier ; si l’onglet En-têtes a déjà le même en-tête, c’est lui qui compte. Dans le Corps, le Type choisit JSON, XML, SOAP, formulaire, multipart (champs de texte et fichiers) ou un fichier envoyé en binaire, et le Content-Type est ajouté quand vous n’en avez pas écrit. Un chemin de fichier relatif part du dossier du .lnh. Avec multipart ou un fichier, la flèche du bouton de copie grise PowerShell et JavaScript, qui ne savent pas envoyer ce corps. L’onglet Options change le délai d’attente (60 s par défaut) et fait suivre les redirections — sans cela, la réponse affichée est le 3xx lui-même. Ouvert dans une version antérieure de LightNote, le fichier part sans l’authentification ni le type, et jamais comme une autre requête. Pour un serveur local avec son propre certificat, Ne pas vérifier le certificat (HTTPS) coupe la vérification : tant que l’option est activée, la ligne de la réponse indique certificat non vérifié, et lnote http-run le dit aussi dans le rapport.

Lire la réponse. Le corps s’ouvre dans un éditeur de code en lecture seule, coloré selon le type de la réponse, avec le pliage des blocs et la recherche de la fenêtre (Ctrl+F). L’onglet Cookies liste ce que le serveur a demandé d’enregistrer, et la Chronologie montre la requête exacte qui est partie — avec les en-têtes que curl a ajoutés — et les en-têtes bruts de la réponse. La chronologie reste en mémoire seulement : elle répète l’Authorization, et le fichier va dans Git.

Vérifications

L'onglet Vérifications indique si le test a réussi. Chaque ligne compare une partie de la réponse — le statut, un en-tête, le corps entier, un chemin JSONPath ($.user.id, $.items[0].name, $.items.length()), un chemin XPath (//Prix, count(//Item)) ou la durée en millisecondes — à la valeur attendue : égal, différent, supérieur, inférieur, contient, correspond à une expression régulière, existe ou est d'un type. En XPath, le préfixe du nom est ignoré : soap:Envelope et Envelope sont la même étape. Avec des vérifications, ce sont elles qui décident du résultat : un 404 attendu réussit, et un 200 avec le mauvais champ échoue. Le résultat de chacune s'affiche dans la dernière colonne, le résumé à côté du badge de la réponse, et le point du test dans la liste devient vert ou rouge. Une ligne décochée reste dans le fichier sans compter dans le résultat.

Le bouton de lecture en haut de la liste exécute tous les tests du fichier, un par un, et indique combien ont réussi. Dès qu'un test a été exécuté deux fois, le bouton de comparaison au-dessus du corps de la réponse ouvre l'exécution précédente et l'actuelle côte à côte, avec le corps formaté des deux côtés. Seule l'exécution précédente est conservée : le fichier va dans Git, et un long historique remplirait chaque diff.

Environnements, captures et le dossier entier

Les environnements utilisent le format ouvert de JetBrains et de VS Code : un http-client.env.json dans le dossier (ou au-dessus) avec un objet par environnement — {"dev": {"host": "http://localhost:8080"}} — et, à côté, un http-client.private.env.json avec les secrets, pour les garder hors de Git. Dans un même environnement, le fichier privé l'emporte, et $shared vaut pour tous. Le sélecteur à côté de l'URL choisit l'environnement, et le menu d'import et d'export crée le fichier. Une variable vient du test, puis d'une capture, puis de l'environnement, et l'onglet Variables indique d'où vient chacune.

L'onglet Captures garde un morceau de la réponse comme variable — le token d'une connexion, l'id d'une ressource tout juste créée — pour les tests suivants de ce fichier et des autres du même dossier. C'est ainsi qu'un .lnh de connexion alimente l'appel authentifié d'un autre. La valeur capturée reste uniquement en mémoire et n'est jamais écrite dans le fichier.

Le dossier est la collection : lnote http-run --path <dossier> --env dev exécute tous ses .lnh dans l'ordre naturel (01-login avant 02-profil) et se termine en erreur quand un test échoue, ce qui convient à une CI. La même exécution est disponible par MCP sous le nom http_test_run, pour que l'agent d'IA exécute les tests que vous avez écrits. Par défaut, les fichiers ne changent pas ; --save y enregistre le dernier résultat de chaque test.

Importer et exporter

Importer et exporter OpenAPI. Le bouton à flèches en haut de la liste des tests ouvre Importer OpenAPI… et Exporter OpenAPI…. L'import lit une spécification en YAML ou JSON dans les trois générations en usage — Swagger 2.0, OpenAPI 3.0 et 3.1 — et construit le test tout seul : les {paramètres} du chemin utilisent déjà la même syntaxe que les variables {nom} du fichier .lnh, les exemples déclarés deviennent les valeurs du test, le schéma de sécurité devient l'en-tête Authorization, et chaque serveur déclaré devient un test à part entière (recette et production côte à côte). Comme un .lnh contient un point de terminaison, une spécification comportant plusieurs opérations demande laquelle importer — ou écrit toutes d'un coup, un fichier .lnh par opération.

L'export fait le chemin inverse et produit une spécification OpenAPI 3.0.3 à partir du fichier : serveurs, paramètres et corps proviennent du modèle, et les réponses d'exemple proviennent des exécutions enregistrées. C'est un squelette, pas un contrat complet — le .lnh décrit des appels, donc les types, descriptions et schémas ne sont pas reconstruits. Vos tests voyagent dans le champ x-lightnote-tests, et reviennent donc intacts lors d'un réimport du fichier.

Importer une commande curl. Dans le même bouton, Importer une commande curl… ouvre une zone de collage — c'est de là que vient la commande, pas du disque, et le champ est prérempli lorsqu'un curl se trouve dans le presse-papiers. Il comprend les trois dialectes dans lesquels circule la même commande : Copier comme cURL de Chrome/Firefox (guillemets simples), Copy as cURL (cmd) sous Windows (avec ^) et l'exemple de documentation coupé par \. La méthode provient de -X — ou est déduite : POST s'il y a un corps, GET sinon.

L'import est littéral : aucune valeur ne devient d'elle-même une variable {nom}, car deviner quel jeton est un secret se tromperait. Certains cas avertissent plutôt que de mentir — un corps provenant d'un fichier (-d @fichier) ne peut pas être lu, et un envoi multipart (-F) n'est pas reproduit fidèlement ; les champs sont donc placés en texte dans le corps pour que vous les ajustiez.

Importer depuis un autre outil. Importer depuis un autre outil… lit un fichier .http/.rest (REST Client de VS Code, JetBrains, Visual Studio), une collection ou un environnement Postman, un export Insomnia (v4 en JSON ou v5 en YAML), le HAR que le navigateur enregistre avec Tout enregistrer au format HAR, un .bru de Bruno (ou le dossier entier, avec Importer un dossier Bruno…) et le WSDL d’un service SOAP. Le format est reconnu d’après le contenu, pas d’après l’extension. Chaque requête devient un .lnh et les dossiers de la collection deviennent des dossiers : choisissez-en une pour ce fichier ou enregistrez-les toutes d’un coup. {{name}} devient {name}, l’authentification devient un en-tête, les environnements vont dans http-client.env.json (ce que la source marque comme secret va dans le .private) sans changer aucune valeur déjà présente, et les vérifications et captures de Bruno — ainsi que le pm.response.to.have.status de Postman — deviennent des vérifications et captures ici. Du HAR ne viennent que les appels d’API et la page, avec la réponse reçue par le navigateur comme dernière exécution ; du WSDL sort une enveloppe SOAP par opération, avec le SOAPAction et chaque champ en variable.

Ce qui n’a pas d’équivalent reste tel quel, et c’est dit : les scripts avant et après la requête ne sont pas convertis, les variables dynamiques ({{$guid}}) et les enchaînements restent littéraux, et le Basic avec variable, le corps multipart et le corps de fichier passent dans l’onglet Authentification et dans le Type du corps — avec le chemin du fichier, venu de l’autre machine, listé pour vérification. À l’enregistrement de la collection, ce rapport devient une note dans le dossier de destination. Exporter en .http… fait le chemin inverse avec le test sélectionné : le modèle avec {{name}} et les valeurs en @name = valeur.

Index

Édition

Outils

Automatisation (IA / scripts)

Référence