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.