HTTP-APIs testen (.lnh)

Datei → Neu → Neuer API-Test öffnet einen HTTP-Client, der in einer .lnh-Datei gespeichert wird. Eine Datei steht für einen Endpunkt (Methode, URL, Kopfzeilen und Textkörper) und behält mehrere Tests in der Liste links — jeder Test mit seinen Werten für die in URL, Kopfzeilen und Textkörper verwendeten Variablen {name}, plus dem Ergebnis der letzten Ausführung (Status, Zeit, Datum, Antwort-Kopfzeilen und -Textkörper). Es zeigt auch den entsprechenden curl-Befehl. Dieselbe einmalige Operation ist über CLI (http) und MCP (http_request) verfügbar. Der Tester verwendet curl, das in Windows 10 und 11 bereits enthalten ist; fehlt es, öffnet LightNote vor dem Senden den Installationsleitfaden.

Senden und Antwort lesen

Strg+Enter sendet die Anfrage. Solange die Antwort nicht da ist, wird derselbe Knopf zu Stoppen (oder Esc), und die Wartezeit zeigt die Sekunden. Das Abzeichen der Antwort zeigt Status und Dauer; daneben stehen Typ, Größe und wann der Test lief. Die curl-Zeile folgt dem, was du tippst, schon mit den Variablen des ausgewählten Tests: der Knopf daneben kopiert den Befehl, und sein Pfeil bietet dasselbe in PowerShell, Python, JavaScript, C# und HTTPie. Einen curl-Befehl direkt in die URL einzufügen, übernimmt Methode, Kopfzeilen und Text, ohne die Tests zu löschen.

Eine Variable ohne Wert im Test wird wörtlich gesendet ({id} in der URL, und der Server antwortet mit einem Fehler, der nicht sagt, warum) — der Tab Variablen hebt sie hervor und nennt sie. Der Punkt neben jedem Test in der Liste hat die Farbe des letzten Status, und der leere Ring ist ein Test, der noch nicht lief. In der Antwort formatiert die Leiste über dem Text JSON/XML nur auf dem Bildschirm, bricht Zeilen um, kopiert den Text und speichert ihn so, wie er kam, in einer Datei.

Die Anfrage zusammenstellen. Der Tab Parameter zeigt die Query der URL als Liste: Eine Zeile zu ändern ändert die URL, und die URL zu ändern ändert die Liste. Der Tab Authentifizierung baut die Kopfzeile selbst — Basic, Bearer oder API-Schlüssel, in einer Kopfzeile oder in der URL —, und jedes Feld nimmt eine {variable} an, damit das Geheimnis in der Umgebung liegt und nicht in der Datei; hat der Tab Kopfzeilen schon dieselbe Kopfzeile, gilt diese. Im Text wählt der Typ JSON, XML, SOAP, Formular, Multipart (Textfelder und Dateien) oder eine binär gesendete Datei, und der Content-Type wird ergänzt, wenn du keinen geschrieben hast. Ein relativer Dateipfad zählt ab dem Ordner der .lnh. Bei Multipart oder Datei graut der Pfeil der Kopieren-Schaltfläche PowerShell und JavaScript aus, weil sie diesen Text nicht senden können. Der Tab Optionen ändert das Zeitlimit (standardmäßig 60 s) und lässt die Anfrage Weiterleitungen folgen — ohne das zeigt die Antwort das 3xx selbst. In einer älteren LightNote-Version geöffnet, wird die Datei ohne die Authentifizierung und ohne den Typ gesendet, nie als eine andere Anfrage. Für einen lokalen Server mit eigenem Zertifikat schaltet Zertifikat nicht prüfen (HTTPS) die Prüfung ab: Solange die Option aktiv ist, steht in der Antwortzeile Zertifikat nicht geprüft, und lnote http-run sagt es auch im Bericht.

Die Antwort lesen. Der Antworttext öffnet sich in einem schreibgeschützten Code-Editor, hervorgehoben nach dem Typ der Antwort, mit Faltung und der Suche des Fensters (Ctrl+F). Der Tab Cookies listet, was der Server speichern lassen will, und der Zeitverlauf zeigt die genau gesendete Anfrage — mit den Kopfzeilen, die curl selbst ergänzt hat — und die rohen Kopfzeilen der Antwort. Der Zeitverlauf bleibt nur im Speicher: Er wiederholt die Authorization, und die Datei landet in Git.

Prüfungen

Der Tab Prüfungen zeigt, ob der Test bestanden hat. Jede Zeile vergleicht einen Teil der Antwort — den Status, eine Kopfzeile, den ganzen Text, einen JSONPath ($.user.id, $.items[0].name, $.items.length()), einen XPath (//Price, count(//Item)) oder die Zeit in Millisekunden — mit dem erwarteten Wert: gleich, verschieden, größer, kleiner, enthält, passt auf einen regulären Ausdruck, existiert oder ist von einem Typ. Im XPath wird das Namenspräfix ignoriert, soap:Envelope und Envelope sind also derselbe Schritt. Mit Prüfungen entscheiden sie das Ergebnis: ein erwartetes 404 besteht, und ein 200 mit falschem Feld fällt durch. Das Ergebnis jeder Prüfung steht in der letzten Spalte, die Zusammenfassung neben dem Abzeichen der Antwort, und der Punkt des Tests in der Liste wird grün oder rot. Eine abgewählte Zeile bleibt in der Datei, zählt aber nicht zum Ergebnis.

Der Abspielknopf oben in der Liste führt alle Tests der Datei nacheinander aus und zeigt, wie viele bestanden haben. Sobald ein Test zweimal gelaufen ist, öffnet der Vergleichsknopf über dem Antworttext die vorherige und die aktuelle Ausführung nebeneinander, mit auf beiden Seiten formatiertem Text. Nur die vorherige Ausführung wird gespeichert: die Datei kommt ins Git, und ein langer Verlauf würde jeden Diff füllen.

Umgebungen, Erfassungen und der ganze Ordner

Umgebungen nutzen das offene Format von JetBrains und VS Code: eine http-client.env.json im Ordner (oder darüber) mit einem Objekt pro Umgebung — {"dev": {"host": "http://localhost:8080"}} — und daneben eine http-client.private.env.json mit den Geheimnissen, damit sie nicht ins Git kommen. In derselben Umgebung gewinnt die private Datei, und $shared gilt für alle. Die Auswahl neben der URL wählt die Umgebung, und das Import-/Exportmenü erstellt die Datei. Eine Variable kommt aus dem Test, dann aus einer Erfassung, dann aus der Umgebung, und der Tab Variablen zeigt, woher jede stammt.

Der Tab Erfassungen speichert einen Teil der Antwort als Variable — das token eines Logins, die id einer neu angelegten Ressource — für die folgenden Tests in dieser Datei und in den anderen desselben Ordners. So versorgt eine Login-.lnh den authentifizierten Aufruf einer anderen. Der erfasste Wert bleibt nur im Speicher und kommt nie in die Datei.

Der Ordner ist die Sammlung: lnote http-run --path <Ordner> --env dev führt alle seine .lnh in natürlicher Reihenfolge aus (01-login vor 02-profil) und endet mit Fehler, wenn ein Test fehlschlägt — passend für eine CI. Dieselbe Ausführung gibt es per MCP als http_test_run, damit der KI-Agent deine Tests ausführen kann. Standardmäßig bleiben die Dateien unverändert; --save schreibt das letzte Ergebnis jedes Tests hinein.

Importieren und exportieren

OpenAPI importieren und exportieren. Die Pfeil-Schaltfläche oben in der Testliste öffnet OpenAPI importieren… und OpenAPI exportieren…. Der Import liest eine Spezifikation in YAML oder JSON in den drei gebräuchlichen Generationen — Swagger 2.0, OpenAPI 3.0 und 3.1 — und baut den Test selbst auf: die {Parameter} im Pfad verwenden bereits dieselbe Syntax wie die {Name}-Variablen der .lnh-Datei, die deklarierten Beispiele werden zu den Testwerten, das Sicherheitsschema wird zum Authorization-Header, und jeder deklarierte Server wird zu einem eigenen Test (Test- und Produktivumgebung nebeneinander). Da eine .lnh-Datei einen Endpunkt enthält, fragt eine Spezifikation mit mehreren Operationen, welche importiert werden soll — oder schreibt alle auf einmal, eine .lnh-Datei pro Operation.

Der Export geht den umgekehrten Weg und erzeugt aus der Datei eine OpenAPI-3.0.3-Spezifikation: Server, Parameter und Rumpf stammen aus der Vorlage, die Beispielantworten aus den aufgezeichneten Ausführungen. Das ist ein Gerüst, kein vollständiger Vertrag — die .lnh-Datei beschreibt Aufrufe, also werden Typen, Beschreibungen und Schemata nicht rekonstruiert. Ihre Tests reisen im Feld x-lightnote-tests mit und kommen deshalb beim erneuten Import unversehrt zurück.

Einen curl-Befehl importieren. In derselben Schaltfläche öffnet curl-Befehl importieren… ein Einfügefeld — von dort kommt der Befehl, nicht von der Festplatte, und das Feld ist vorausgefüllt, wenn ein curl in der Zwischenablage liegt. Es versteht die drei Dialekte, in denen derselbe Befehl kursiert: Als cURL kopieren aus Chrome/Firefox (einfache Anführungszeichen), Copy as cURL (cmd) unter Windows (mit ^) und das mit \ umbrochene Beispiel aus der Dokumentation. Die Methode stammt aus -X — oder wird abgeleitet: POST, wenn ein Rumpf vorhanden ist, sonst GET.

Der Import ist wörtlich: Kein Wert wird von selbst zu einer {Name}-Variablen, denn zu raten, welches Token ein Geheimnis ist, ginge schief. Einige Fälle warnen, statt zu lügen — ein Rumpf aus einer Datei (-d @datei) kann nicht gelesen werden, und ein Multipart-Upload (-F) wird nicht originalgetreu nachgebildet; die Felder landen deshalb als Text im Rumpf, damit Sie sie anpassen können.

Aus einem anderen Tool importieren. Aus einem anderen Tool importieren… liest eine .http/.rest-Datei (REST Client für VS Code, JetBrains, Visual Studio), eine Postman-Sammlung oder -Umgebung, einen Insomnia-Export (v4 als JSON oder v5 als YAML), die HAR-Datei, die der Browser mit Alle als HAR speichern schreibt, eine Bruno-Datei .bru (oder den ganzen Ordner über Bruno-Ordner importieren…) und die WSDL eines SOAP-Dienstes. Das Format wird am Inhalt erkannt, nicht an der Endung. Jede Anfrage wird zu einer .lnh, und die Ordner der Sammlung werden zu Ordnern: Wählen Sie eine für diese Datei oder speichern Sie alle auf einmal. {{name}} wird zu {name}, die Authentifizierung zu einer Kopfzeile, Umgebungen landen in http-client.env.json (was die Quelle als geheim markiert, in der .private-Datei), ohne einen vorhandenen Wert zu ändern, und die Prüfungen und Erfassungen von Bruno — sowie pm.response.to.have.status aus Postman — werden zu Prüfungen und Erfassungen hier. Aus einer HAR kommen nur die API-Aufrufe und die Seite, mit der Antwort des Browsers als letzter Ausführung; aus einer WSDL entsteht pro Operation ein SOAP-Umschlag mit SOAPAction und jedem Feld als Variable.

Was keine Entsprechung hat, bleibt unverändert und wird genannt: Skripte vor und nach der Anfrage werden nicht konvertiert, dynamische Variablen ({{$guid}}) und Verkettungen bleiben wörtlich, und Basic mit Variable, Multipart-Text und Datei-Text landen im Tab Authentifizierung und im Typ des Textes — der Dateipfad, der vom anderen Rechner stammt, wird zum Prüfen aufgelistet. Beim Speichern der Sammlung wird dieser Bericht zu einer Notiz im Zielordner. Als .http exportieren… geht den umgekehrten Weg mit dem ausgewählten Test: die Vorlage mit {{name}} und die Werte als @name = Wert.

Inhalt

Bearbeiten

Werkzeuge

Automatisierung (KI / Skripte)

Referenz