Testen Sie eine REST-API mit curl

Testen Sie eine REST-API mit curl

 

1. Überblick

Dieses Tutorial gibt einen kurzen Überblick über das Testen einer REST-API mitcurl.

curl is a command-line tool for transferring data and supports about 22 protocols including HTTP. Diese Kombination macht es zu einem sehr guten Ad-hoc-Tool zum Testen unserer REST-Services.

Weitere Lektüre:

Testen von Web-APIs mit Postman Collections

Erfahren Sie, wie Sie eine Postman-Sammlung erstellen, mit der eine REST-API getestet werden kann

Read more

Ein Leitfaden für REST-versicherte

Lernen Sie die Grundlagen von REST-assured kennen - eine Bibliothek, die das Testen und Validieren von REST-APIs vereinfacht.

Read more

2. Befehlszeilenoptionen

curl supports over 200 command-line options. Und wir können null oder mehr von ihnen haben, um die URL im Befehl zu begleiten.

Bevor wir es jedoch für unsere Zwecke verwenden, werfen wir einen Blick auf zwei, die unser Leben erleichtern würden.

2.1. Ausführlich

Wenn wir testen, ist es eine gute Idee, den ausführlichen Modus zu aktivieren:

curl -v http://www.example.com/

Infolgedessen liefern die Befehle hilfreiche Informationen wie die aufgelöste IP-Adresse, den Port, zu dem wir eine Verbindung herstellen möchten, und die Header.

2.2. Ausgabe

Standardmäßig gibt curl den Antworttext als Standardausgabe aus. Optional können wir die Ausgabeoption zum Speichern in eine Datei bereitstellen:

curl -o out.json http://www.example.com/index.html

Dies ist besonders hilfreich, wenn die Antwortgröße groß ist.

3. HTTP-Methoden mit Curl

Jede HTTP-Anfrage enthält eine Methode. Die am häufigsten verwendeten Methoden sind GET, POST, PUT und DELETE.

3.1. GET

Dies ist die Standardmethode für HTTP-Aufrufe mit Curl. In der Tat waren die zuvor gezeigten Beispiele einfache GET-Aufrufe.

Beim Ausführen einer lokalen Instanz eines Dienstes an Port 8082 verwenden wir so etwas wie diesen Befehl, um einen GET-Aufruf durchzuführen:

curl -v http://localhost:8082/spring-rest/foos/9

Und da wir den ausführlichen Modus aktiviert haben, erhalten wir zusammen mit dem Antworttext ein wenig mehr Informationen:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> GET /spring-rest/foos/9 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200
< X-Application-Context: application:8082
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 15 Jul 2018 11:55:26 GMT
<
{
  "id" : 9,
  "name" : "TuwJ"
}* Connection #0 to host localhost left intact

3.2. POST

Wir verwenden diese Methode, um Daten an einen empfangenden Dienst zu senden. Und dafür verwenden wir die Datenoption.

Die einfachste Möglichkeit besteht darin, die Daten in den Befehl einzubetten:

curl -d 'id=9&name=example' http://localhost:8082/spring-rest/foos/new

oder übergeben Sie eine Datei mit dem Anforderungshauptteil wie folgt an die Datenoption:

curl -d @request.json -H "Content-Type: application/json"
  http://localhost:8082/spring-rest/foos/new

Wenn Sie die obigen Befehle so verwenden, wie sie sind, können Fehlermeldungen wie die folgende auftreten:

{
  "timestamp" : "15-07-2018 05:57",
  "status" : 415,
  "error" : "Unsupported Media Type",
  "exception" : "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path" : "/spring-rest/foos/new"
}

Dies liegt daran, dass curl allen POST-Anforderungen den folgenden Standardheader hinzufügt:

Content-Type: application/x-www-form-urlencoded

Dies ist auch das, was die Browser in einem einfachen POST verwenden. Bei unserer Verwendung möchten wir die Header normalerweise an unsere Bedürfnisse anpassen.

Wenn unser Service beispielsweise einen json-Inhaltstyp erwartet, können wir die Option -H verwenden, um unsere ursprüngliche POST-Anfrage zu ändern:

curl -d '{"id":9,"name":"example"}' -H 'Content-Type: application/json'
  http://localhost:8082/spring-rest/foos/new

Die Windows-Eingabeaufforderung unterstützt keine einfachen Anführungszeichen wie die Unix-ähnlichen Shells.

Infolgedessen müssen wir die einfachen Anführungszeichen durch doppelte Anführungszeichen ersetzen. ihnen zu entkommen, wo immer es nötig ist:

curl -d "{\"id\":9,\"name\":\"example\"}" -H "Content-Type: application/json"
  http://localhost:8082/spring-rest/foos/new

Außerdem ist es normalerweise eine gute Idee, eine Datendatei zu verwenden, wenn wir eine etwas größere Datenmenge senden möchten.

3.3. PUT

Diese Methode ist POST sehr ähnlich. Wir verwenden es jedoch, wenn wir eine neue Version einer vorhandenen Ressource senden möchten. Dazu verwenden wir die Option -X.

Ohne Angabe eines Anforderungsmethodentyps verwendet curl standardmäßig GET. Aus diesem Grund erwähnen wir ausdrücklich den Methodentyp bei PUT:

curl -d @request.json -H 'Content-Type: application/json'
  -X PUT http://localhost:8082/spring-rest/foos/9

3.4. LÖSCHEN

Wieder geben wir an, dass wir DELETE verwenden möchten, indem wir die Option -X verwenden:

curl -X DELETE http://localhost:8082/spring-rest/foos/9

4. Benutzerdefinierte Header

Wir können die Standardüberschriften ersetzen oder unsere eigenen Überschriften hinzufügen.

Um beispielsweise den Host-Header zu ändern, gehen Sie wie folgt vor:

curl -H "Host: com.example" http://example.com/

Um den User-Agent-Header auszuschalten, geben wir einen leeren Wert ein:

curl -H "User-Agent:" http://example.com/

Das üblichste Szenario beim Testen ist das Ändern des Headers für Inhaltstyp und Akzeptieren. Wir müssen jedem Header nur die Option -H voranstellen:

curl -d @request.json -H "Content-Type: application/json"
  -H "Accept: application/json" http://localhost:8082/spring-rest/foos/new

5. Authentifizierung

Einservice that requires authentication würde einen 401 - Nicht autorisierten HTTP-Antwortcode und einen zugehörigen WWW-Authenticate-Header zurücksenden.

Für die Basisauthentifizierung können wirsimply embed the username and password combination inside our request using the user option:

curl --user example:secretPassword http://example.com/

Wenn wir jedochuse OAuth2 for authentication möchten, müssen wir zuerst das access_token von unserem Autorisierungsdienst abrufen.

Die Serviceantwort würdeaccess_token: enthalten

{
  "access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
  "token_type": "bearer",
  "refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
  "expires_in": 31234
}

Jetzt können wir das Token in unserem Authorization-Header verwenden:

curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" http://example.com/

6. Fazit

Wir haben uns überlegt, ob wir die Mindestfunktionalität von Curl zum Testen unserer REST-Services verwenden können. Obwohl es viel mehr kann als das, was hier diskutiert wurde, sollte dies für unseren Zweck ausreichen.

Sie können auch curl -h in die Befehlszeile eingeben, um alle verfügbaren Optionen zu überprüfen. Der für die Demonstration verwendete REST-Service isthere on GitHub verfügbar.