Тествайте REST API с curl

1. Общ преглед

Този урок дава кратък преглед на тестването на REST API с помощта на curl.

curl е инструмент за команден ред за прехвърляне на данни и поддържа около 22 протокола, включително HTTP. Тази комбинация го прави много добър ad-hoc инструмент за тестване на нашите REST услуги.

2. Опции на командния ред

curl поддържа над 200 опции от командния ред . И можем да имаме нула или повече от тях, които да придружават URL адреса в командата.

Но преди да го използваме за нашите цели, нека разгледаме две, които биха улеснили живота ни.

2.1. Многословен

Когато тестваме, е добра идея да включите подробния режим:

curl -v //www.example.com/

В резултат на това командите ще предоставят полезна информация като разрешения IP адрес, порта, с който се опитваме да се свържем, и заглавията.

2.2. Изход

По подразбиране curl извежда тялото на отговора към стандартен изход. По желание можем да предоставим изходната опция за записване във файл:

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

Това е особено полезно, когато размерът на отговора е голям.

3. HTTP методи с къдрици

Всяка HTTP заявка съдържа метод. Най-често използваните методи са GET, POST, PUT и DELETE.

3.1. ВЗЕМЕТЕ

Това е методът по подразбиране при извършване на HTTP повиквания с curl. Всъщност показаните по-рано примери бяха обикновени GET повиквания.

Докато изпълняваме локален екземпляр на услуга на порт 8082, бихме използвали нещо като тази команда, за да осъществим GET повикване:

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

И тъй като сме включили подробния режим, ще получим малко повече информация заедно с тялото на отговора:

* 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. ПОСТ

Използваме този метод за изпращане на данни до получаваща услуга. И за това използваме опцията за данни.

Най-простият начин да направите това е да вградите данните в командата:

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

или предайте файл, съдържащ тялото на заявката, на опцията за данни по следния начин:

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

Използвайки горните команди, каквито са, можем да срещнем съобщения за грешка като следното:

{ "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" }

Това е така, защото curl добавя следния заглавие по подразбиране към всички POST заявки:

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

Това е и това, което браузърите използват в обикновен POST. При нашето използване обикновено бихме искали да персонализираме заглавията в зависимост от нашите нужди.

Например, ако нашата услуга очаква json тип съдържание, тогава можем да използваме опцията -H, за да модифицираме нашата оригинална POST заявка:

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

Командният ред на Windows няма поддръжка на единични кавички като Unix-подобни черупки.

В резултат на това ще трябва да заменим единичните кавички с двойни кавички; избягвайки ги, когато е необходимо:

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

Освен това, когато искаме да изпратим малко по-голямо количество данни, обикновено е добра идея да използваме файл с данни.

3.3. СЛАГАМ

Този метод е много подобен на POST. Но ние го използваме, когато искаме да изпратим нова версия на съществуващ ресурс. За да направим това, използваме опцията -X.

Без никакво споменаване на типа метод на заявка, curl по подразбиране използва GET. Ето защо изрично споменаваме типа на метода в случай на PUT:

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

3.4. ИЗТРИЙ

Отново уточняваме, че искаме да използваме DELETE, като използваме опцията -X:

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

4. Персонализирани заглавия

Можем да заменим заглавията по подразбиране или да добавим собствени заглавки.

Например, за да променим заглавката на хоста, правим това:

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

За да изключим заглавката User-Agent, поставяме празна стойност:

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

Най-обичайният сценарий по време на тестване е промяната на заглавката Content-Type и Accept. Просто трябва да добавим пред всеки заглавие опцията -H:

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

5. Удостоверяване

Услуга, която изисква удостоверяване, ще изпрати обратно 401 - неупълномощен HTTP код за отговор и свързана заглавка за удостоверяване на WWW.

За основно удостоверяване можем просто да вградим комбинацията от потребителско име и парола в нашата заявка, използвайки опцията потребител :

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

Ако обаче искаме да използваме OAuth2 за удостоверяване, първо трябва да получим access_token от нашата услуга за оторизация.

Отговорът на услугата ще съдържа access_token:

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

Сега можем да използваме маркера в заглавката ни за упълномощаване:

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

6. Заключение

Разгледахме използването на минималната функционалност на curl, за да тестваме нашите REST услуги. Въпреки че може да направи много повече от това, което беше обсъдено тук, за нашата цел това трябва да е достатъчно.

Чувствайте се свободни да напишете curl -h в командния ред, за да проверите всички налични опции. Услугата REST, използвана за демонстрацията, е достъпна тук на GitHub.