Testen Sie eine REST-API mit Curl

1. Übersicht

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

curl ist ein Befehlszeilenprogramm zum Übertragen von Daten und unterstützt etwa 22 Protokolle, einschließlich HTTP. Diese Kombination macht es zu einem sehr guten Ad-hoc-Tool zum Testen unserer REST-Services.

2. Befehlszeilenoptionen

Curl unterstützt über 200 Befehlszeilenoptionen . Und wir können null oder mehr davon haben, um die URL im Befehl zu begleiten.

Aber bevor wir es für unsere Zwecke verwenden, werfen wir einen Blick auf zwei, die unser Leben leichter machen würden.

2.1. Ausführlich

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

curl -v //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 auf die Standardausgabe aus. Optional können wir die Ausgabeoption zum Speichern in einer Datei bereitstellen:

curl -o out.json //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. BEKOMMEN

Dies ist die Standardmethode beim Tätigen von HTTP-Aufrufen mit Curl. Tatsächlich 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 //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.

Der einfachste Weg, dies zu tun, besteht darin, die Daten in den Befehl einzubetten:

curl -d 'id=9&name=baeldung' //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" //localhost:8082/spring-rest/foos/new

Wenn Sie die obigen Befehle so verwenden, wie sie sind, können Fehlermeldungen wie die folgenden 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. In unserer Verwendung möchten wir normalerweise die Header an unsere Bedürfnisse anpassen.

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

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

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

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

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

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

3.3. STELLEN

This method is very similar to POST. But we use it when we want to send a new version of an existing resource. In order to do this, we use the -X option.

Without any mention of a request method type, curl defaults to using GET. Therefore, we explicitly mention the method type in case of PUT:

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

3.4. DELETE

Again, we specify that we want to use DELETE by using the -X option:

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

4. Custom Headers

We can replace the default headers or add our own headers.

For instance, to change the Host header, we do this:

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

To switch off the User-Agent header, we put in an empty value:

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

The most usual scenario while testing is changing the Content-Type and Accept header. We'd just have to prefix each header with the -H option:

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

5. Authentication

A service that requires authentication would send back a 401 – Unauthorized HTTP response code and an associated WWW-Authenticate header.

Für die Basisauthentifizierung können wir einfach die Kombination aus Benutzername und Passwort in unsere Anfrage einbetten, indem wir die Benutzeroption verwenden :

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

Wenn wir jedoch OAuth2 zur Authentifizierung verwenden möchten, müssen wir zuerst das access_token von unserem Autorisierungsdienst abrufen.

Die Serviceantwort würde das access_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 Autorisierungsheader verwenden:

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

6. Fazit

Wir haben uns überlegt, die minimale Funktionalität von Curl zu verwenden, um unsere REST-Services zu testen. Obwohl es viel mehr kann als das, was hier diskutiert wurde, sollte dies für unseren Zweck ausreichen.

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