Test een REST API met curl

1. Overzicht

Deze tutorial geeft een kort overzicht van het testen van een REST API met krullen.

krullen is een opdrachtregelprogramma voor het overdragen van gegevens en ondersteunt ongeveer 22 protocollen, waaronder HTTP. Deze combinatie maakt het een zeer goede ad-hoc tool om onze REST-services te testen.

2. Opdrachtregelopties

curl ondersteunt meer dan 200 opdrachtregelopties. En we kunnen er nul of meer hebben om de URL in de opdracht te begeleiden.

Maar voordat we het voor onze doeleinden gebruiken, laten we er twee bekijken die ons leven gemakkelijker zouden maken.

2.1. Uitgebreid

Tijdens het testen is het een goed idee om de uitgebreide modus in te stellen op:

krul -v //www.example.com/

Als gevolg hiervan zouden de opdrachten nuttige informatie bieden, zoals het opgeloste IP-adres, de poort waarmee we verbinding proberen te maken en de headers.

2.2. Uitvoer

Curl voert standaard de antwoordtekst uit naar de standaarduitvoer. Optioneel kunnen we de uitvoeroptie bieden om op te slaan in een bestand:

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

Dit is vooral handig als de respons groot is.

3. HTTP-methoden met curl

Elk HTTP-verzoek bevat een methode. De meest gebruikte methoden zijn GET, POST, PUT en DELETE.

3.1. KRIJGEN

Dit is de standaardmethode bij het maken van HTTP-aanroepen met curl. In feite waren de eerder getoonde voorbeelden gewone GET-oproepen.

Terwijl we een lokale instantie van een service uitvoeren op poort 8082, zouden we zoiets als dit commando gebruiken om een ​​GET-aanroep te maken:

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

En aangezien we de uitgebreide modus hebben ingeschakeld, krijgen we wat meer informatie samen met de antwoordtekst:

* Probeert :: 1 ... * TCP_NODELAY set * Verbonden met localhost (:: 1) poort 8082 (# 0)> GET / spring-rest / foos / 9 HTTP / 1.1> Host: localhost: 8082> User-Agent: curl / 7.60.0> Accepteren: * / *> <HTTP / 1.1 200 <X-Application-Context: application: 8082 <Content-Type: application / json; charset = UTF-8 <Transfer-Encoding: chunked <Datum: Sun, 15 Jul 2018 11:55:26 GMT <{"id": 9, "name": "TuwJ"} * Verbinding # 0 naar host localhost intact gelaten

3.2. POST

We gebruiken deze methode om gegevens naar een ontvangende dienst te sturen. En daarvoor gebruiken we de data-optie.

De eenvoudigste manier om dit te doen, is door de gegevens in de opdracht in te bedden:

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

of geef een bestand met de hoofdtekst van het verzoek als volgt door aan de gegevensoptie:

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

Door de bovenstaande opdrachten te gebruiken zoals ze zijn, kunnen we foutmeldingen tegenkomen zoals de volgende:

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

Dit komt doordat curl de volgende standaardkop aan alle POST-verzoeken toevoegt:

Inhoudstype: application / x-www-form-urlencoded

Dit is ook wat de browsers gebruiken in een gewone POST. Bij ons gebruik willen we de kopteksten meestal aanpassen aan onze behoeften.

Als onze service bijvoorbeeld json-inhoudstype verwacht, kunnen we de optie -H gebruiken om ons oorspronkelijke POST-verzoek te wijzigen:

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

De Windows-opdrachtprompt ondersteunt geen enkele aanhalingstekens zoals de Unix-achtige shells.

Als gevolg hiervan zouden we de enkele aanhalingstekens moeten vervangen door dubbele aanhalingstekens; ze waar nodig te ontsnappen:

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

Bovendien, als we een wat grotere hoeveelheid gegevens willen verzenden, is het meestal een goed idee om een ​​gegevensbestand te gebruiken.

3.3. LEGGEN

Deze methode lijkt erg op POST. Maar we gebruiken het wanneer we een nieuwe versie van een bestaande bron willen sturen. Om dit te doen, gebruiken we de optie -X.

Zonder enige vermelding van een type verzoekmethode, gebruikt curl standaard GET. Daarom vermelden we expliciet het type methode in het geval van PUT:

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

3.4. VERWIJDEREN

Nogmaals, we specificeren dat we DELETE willen gebruiken door de optie -X te gebruiken:

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

4. Aangepaste kopteksten

We kunnen de standaard headers vervangen of onze eigen headers toevoegen.

Om bijvoorbeeld de Host-header te wijzigen, doen we dit:

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

Om de User-Agent-header uit te schakelen, vullen we een lege waarde in:

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

Het meest gebruikelijke scenario tijdens het testen is het wijzigen van de Content-Type en Accept-header. We zouden elke koptekst gewoon moeten voorvoegsel met de optie -H:

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

5. Authenticatie

Een service die authenticatie vereist, zou een 401 - Unauthorized HTTP-responscode en een bijbehorende WWW-Authenticate-header terugsturen.

Voor basisverificatie kunnen we sluit eenvoudig de combinatie van gebruikersnaam en wachtwoord in ons verzoek in met behulp van de gebruikersoptie:

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

Als we echter OAuth2 willen gebruiken voor authenticatie, moeten we eerst het access_token ophalen van onze autorisatieservice.

De servicerespons zou de toegangstoken:

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

Nu kunnen we het token in onze autorisatie-header gebruiken:

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

6. Conclusie

We hebben gekeken naar het gebruik van de absolute minimumfunctionaliteit van curl om onze REST-services te testen. Hoewel het veel meer kan doen dan wat hier is besproken, zou dit voor ons doel voldoende moeten zijn.

Typ gerust curl -h op de opdrachtregel om alle beschikbare opties te bekijken. De REST-service die voor de demonstratie wordt gebruikt, is hier beschikbaar op GitHub.