Testowaniew API - cURL i REST Client

Aplikacje do testowania API

Każdy pewnie zna Postman. Ciężko już tu mówić o aplikacji do testowania API, jest to całe wielkie środowisko, pozwalające na wszelką możliwą pracę z API. Testowanie, importy/eksporty, dokumentacja, automatyzacja itp. O Postmanie powstało wiele artykułów, tutoriali, filmów na YT, więc nie będę się nad nim skupiał. Nadmienię tylko, że dla systemów UNIX powstała bardzo ciekawa i godna uwagi alternatywa open-source, a mianowicie projekt Insomnia.

Opiszę dwa narzędzia, które może nie zastąpią wyżej nadmienionych, ale w niektórych przypadkach mogą być bardzo użyteczne.

cURL

"cURL – sieciowa biblioteka programistyczna, napisana w języku C, działająca po stronie klienta, z interfejsami dla ponad 30 innych języków. Umożliwia wysyłanie zapytań HTTP, w tym pobieranie z serwerów stron i plików, a także wysyłanie treści formularzy. Ułatwia tworzenie aplikacji korzystających z protokołu HTTP. Biblioteka cURL ma ogromne możliwości, jej podstawowym zastosowaniem jest tworzenie sprzęgów w złożonych systemach opartych o technologie Webowe."

cytowane za Wikipedią https://pl.wikipedia.org/wiki/CURL

Większość systemów opartych na UNIX, w tym MacOS, ma już zainstalowaną bibliotekę. Na ogół nie trzeba jej więc instalować.

Aby skorzystać z tego pakietu, wystarczy, że w wierszu poleceń po nazwie pakietu wpisze nazwę argumentu oraz jego wartość (argumentów może być kilka, oddzielone spacjami) i URL, pod który wysyłamy request. Podstawowe argumenty:

  • -X, --request - typ metody HTTP, przy metodzie GET parametru nie trzeba dodawać;
  • -d, --data - wysyłanie danych (w metodzie POST);
  • -H, --headers - nagłówki do dołączenia do requestu;

Do testów wykorzystam stronę https://dummyjson.com/, która udostępnia proste developerskie API do testowania funkcjonalności.

Do dyspozycji mam wiele różnych API pozwalających na wszystkie CRUD-owe operacje (Create-Read-Update-Delete). Oczywiście tylko responses sugerują np. poprawność dodania czy usunięcia rekordu. W rzeczywistości dane w API się nie zmieniają.

Przykładowe zapytanie czytające Todos, korzystające z endpointu 'https://dummyjson.com/todos?limit=3' wygląda jak poniżej. Jako że zapytanie ma metodę GET, informacja o typie metody może być pominięta.

terminal
curl https://dummyjson.com/todos?limit=3
{
  "todos":[
    {
      "id":1,
      "todo":"Do something nice for someone I care about",
      "completed":true,
      "userId":26
    },
    {
      "id":2,
      "todo":"Memorize the fifty states and their capitals",
      "completed":false,
      "userId":48
    },
    {
      "id":3,
      "todo":"Watch a classic movie",
      "completed":false,
      "userId":4
    }
  ],
  "total":150,
  "skip":0,
  "limit":3
}

Limit jako parametr URL informuje API, że chcę otrzymać tylko 3 rekordy.

Natomiast aby dodać rekord Todos, request za pomocą cURL będzie wyglądał następująco:

terminal
curl -X POST https://dummyjson.com/todos/add -d '{"todo": "Use DummyJSON in the project", "completed": false, "userId": 5}' -H "Content-Type: application/json"
{
  "id":151,
  "todo":"Use DummyJSON in the project",
  "completed":false,
  "userId":5
}

cURL jest bardzo przydatny jako proste narzędzie do testowania endpointów, przydaje się, zwłaszcza gdy trzeba coś przetestować wewnątrz zewnętrznego serwera, na zdalnym środowisku, lub za pomocą automatycznego skryptu. Gdy jednak mam do dyspozycji moje środowisko deweloperskie i chcę zwyczajnie testować dewelopowane endpointy, używanie go zaczyna być uciążliwe i powolne.

REST client dla VSCode

Bardzo podobna na pierwszy rzut oka do cURL jest wtyczka VSCode, REST Client. Jedna główna różnica polega na zapisywaniu requestów w pliku z rozszerzeniem .http w folderze aplikacji. Pozwala to na swego rodzaju dokumentacje i trzymanie wszystkiego w jednym miejscu, bardzo blisko kodu, który testuje. Wtyczkę instaluję z panelu rozszerzeń Visual Studio Code.

Do stworzenia prostego GET requestu wystarczy zapisać w pliku z rozszerzeniem .http, adres URL poprzedzony typem zapytanie HTTP. Jeśli wtyczka jest poprawnie zainstalowana, a sam plik ma poprawne rozszerzenie, nad URL-em będzie widoczny przycisk Send request.

rest-test.http
https://dummyjson.com/todos?limit=3

Aby zapisać obok siebie w jednym pliku więcej niż jeden request, oddzielam je trzema hash'ami. Jeśli potrzebuję przekazać headery dodaje je jako kolejne linijki pod URL-em. Obiekt, który chcę przekazać jako body requestu, wystarczy dodać poniżej jako zwyczajnie sformatowany obiekt JSON.

rest-test.http
GET https://dummyjson.com/todos?limit=3

###

GET https://dummyjson.com/todos/10

###

POST https://dummyjson.com/todos/add
Content-Type: application/json

{
  "todo": "Use DummyJSON in the project",
  "completed": false,
  "userId": 5
}

Wtyczka ma oczywiście bardzo wiele innych funkcji jak, chociażby zapisywanie response, wykonywanie zapytań GraphQL, używanie różnych wersji protokołu HTTP i wiele innych. Po dokładniejsze dane odsyłam do dokumentacji na github.

Bonus

REST Client pozwala również na wyeksportowanie zapisanego zapytania jako requestu cURL. Wystarczy prawym przyciskiem myszy kliknąć obiekt requestu w pliku .http i wybrać Copy Request as cURL.