Test en REST API med curl

1. Oversigt

Denne vejledning giver en kort oversigt over test af en REST API ved hjælp af krølle

krølle er et kommandolinjeværktøj til overførsel af data og understøtter ca. 22 protokoller inklusive HTTP. Denne kombination gør det til et meget godt ad hoc-værktøj til test af vores REST-tjenester.

2. Kommandolinjevalg

curl understøtter over 200 kommandolinjemuligheder. Og vi kan have nul eller flere af dem til at ledsage URL'en i kommandoen.

Men inden vi bruger det til vores formål, lad os se på to, der ville gøre vores liv lettere.

2.1. Ordrig

Når vi tester, er det en god ide at indstille den detaljerede tilstand til:

krølle -v //www.example.com/

Som et resultat vil kommandoerne give nyttige oplysninger såsom den løste IP-adresse, den port, vi prøver at oprette forbindelse til og overskrifterne.

2.2. Produktion

Som standard udsender krøller svaret til standardoutput. Eventuelt kan vi levere outputmuligheden til at gemme i en fil:

krølle -o out.json //www.example.com/index.html

Dette er især nyttigt, når responsstørrelsen er stor.

3. HTTP-metoder med krølning

Hver HTTP-anmodning indeholder en metode. De mest anvendte metoder er GET, POST, PUT og DELETE.

3.1. FÅ

Dette er standardmetoden, når du foretager HTTP-opkald med curl. Faktisk var de tidligere viste eksempler almindelige GET-opkald.

Mens vi kører en lokal forekomst af en tjeneste i port 8082, bruger vi noget som denne kommando til at foretage et GET-opkald:

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

Og da vi har den detaljerede tilstand slået til, vil vi få lidt mere information sammen med responsorganet:

* Forsøger :: 1 ... * TCP_NODELAY sæt * Forbundet til localhost (:: 1) port 8082 (# 0)> GET / spring-rest / foos / 9 HTTP / 1.1> Host: localhost: 8082> User-Agent: curl / 7.60.0> Accepter: * / *> <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"} * Forbindelse nr. 0 for at være vært for den lokale vært intakt

3.2. STOLPE

Vi bruger denne metode til at sende data til en modtagende tjeneste. Og til det bruger vi dataindstillingen.

Den enkleste måde at gøre dette på er at integrere dataene i kommandoen:

krølle -d 'id = 9 & navn = baeldung' // localhost: 8082 / spring-rest / foos / new

eller send en fil, der indeholder anmodningens organ til dataindstillingen som denne:

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

Ved at bruge ovenstående kommandoer, som de er, kan vi støde på fejlmeddelelser som den følgende:

{"tidsstempel": "15-07-2018 05:57", "status": 415, "error": "Ikke-understøttet medietype", "undtagelse": "org.springframework.web.HttpMediaTypeNotSupportedException", "meddelelse": "Indholdstype 'applikation / x-www-form-urlencoded; charset = UTF-8' understøttes ikke", "path": "/ spring-rest / foos / new"}

Dette skyldes, at curl tilføjer følgende standardoverskrift til alle POST-anmodninger:

Indholdstype: applikation / x-www-form-urlencoded

Dette er også hvad browserne bruger i en almindelig POST. I vores brug vil vi normalt tilpasse overskrifterne afhængigt af vores behov.

For eksempel, hvis vores tjeneste forventer json-indholdstype, så kan vi bruge indstillingen -H til at ændre vores oprindelige POST-anmodning:

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

Windows kommandoprompt har ingen understøttelse af enkelte citater som de Unix-lignende skaller.

Som et resultat er vi nødt til at erstatte de enkelte tilbud med dobbelt tilbud; undslippe dem, hvor det er nødvendigt:

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

Desuden er det normalt en god ide at bruge en datafil, når vi vil sende en noget større mængde data.

3.3. SÆTTE

Denne metode svarer meget til POST. Men vi bruger det, når vi vil sende en ny version af en eksisterende ressource. For at gøre dette bruger vi -X-indstillingen.

Uden nogen omtale af en anmodningsmetodetype er krølle som standard brug af GET. Derfor nævner vi eksplicit metodetypen i tilfælde af PUT:

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

3.4. SLET

Igen specificerer vi, at vi vil bruge SLET ved at bruge indstillingen -X:

krølle -X SLET // // host: 8082 / spring-rest / foos / 9

4. Tilpassede overskrifter

Vi kan erstatte standardoverskrifterne eller tilføje vores egne overskrifter.

For eksempel for at ændre værtsoverskriften gør vi dette:

krølle -H "Host: com.baeldung" //eksempel.com/

For at slukke for User-Agent-overskriften, indsætter vi en tom værdi:

krølle -H "Brugeragent:" //eksempel.com/

Det mest sædvanlige scenarie under test er at ændre indholdstype og accept-overskrift. Vi bliver bare nødt til at præfikse hvert overskrift med indstillingen -H:

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

5. Godkendelse

En tjeneste, der kræver godkendelse, vil sende en 401 - Uautoriseret HTTP-svarskode og en tilknyttet WWW-godkendende overskrift tilbage.

For grundlæggende godkendelse kan vi Integrer blot kombinationen af ​​brugernavn og adgangskode i vores anmodning ved hjælp af brugerindstillingen:

krølle - bruger baeldung: secretPassword //eksempel.com/

Men hvis vi vil bruge OAuth2 til godkendelse, skal vi først hente access_token fra vores autorisationstjeneste.

Tjenestesvaret vil indeholde adgangstoken:

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

Nu kan vi bruge tokenet i vores autorisationsoverskrift:

krølle -H "Autorisation: Bærer b1094abc0-54a4-3eab-7213-877142c33fh3" //eksempel.com/

6. Konklusion

Vi kiggede på at bruge krøllens minimale funktionalitet til at teste vores REST-tjenester. Selvom det kan gøre meget mere end det, der er blevet diskuteret her, skal dette meget til vores formål være tilstrækkeligt.

Du er velkommen til at skrive curl -h på kommandolinjen for at tjekke alle de tilgængelige muligheder. REST-tjenesten, der bruges til demonstrationen, er tilgængelig her på GitHub.