JSON Server - testowe REST API w kilka minut
2017-01-16 · node-js · tools · testowanie
Czasami chciałbyś od razu rozpocząć pracę na frontendzie aplikacji, ale okazuje się, że musisz czekać, aż zespół dopowiedziany za backend wystawi działające API.
Podobnie sprawa się ma z prototypowaniem. Chcesz zrobić coś szybko, ocenić nową koncepcję, stworzyć tutorial, czy poszukać odpowiedzi na pytanie lub sprawdzić który kształt odpowiedzi z serwera najlepiej pasuje. Potrzebujesz więc na tyle dobrego, pełnego prototypu, aby uzyskać wiarygodny osąd, czyli potrzebujesz backendu, CRUDów - JSONowej odpowiedzi z serwera, a przecież nie chcesz tracić dużo czasu na tworzenie prawdziwego web serwisu.
Może również się okazać, że API istniejące w twoim środowisku dev lub QA jest powolne, lub wadliwe, a potrzebujesz szybkich, spójnych i wiarygodnych odpowiedzi z serwera.
Podobnie, jeżeli musisz pracować offline, a chcesz mieć pod ręką działające API.
Odpowiedzią na te problemy jest JSON Server. Jest to bardzo przydatny opensourcowy moduł npm, chodzący na serwerze Express, który pozwala łatwo zamodelować backend. Przy minimalnej konfiguracji, w kilka minut otrzymujesz Web API, Web serwis, JSON API i RESTfull API na potrzeby dewelopmentu lub testowania.
Wymagania
- Node.js: środowisko uruchomieniowe
- npm: manager pakietów dla Node.js
- dowolne narzędzie do wysyłania zapytań na serwer:
- cURL - w przypadku instalacji pod Windowsem, pomocna może się okazać odpowiedź na Stack Overflow
- Postman
- Chrome - od wersji 42 fetch() jest w pełni wspierany przez Chrome
Instalacja
Aby zainstalować JSON Server, otwórz konsolę i wpisz poniższe polecenie:
Flaga -g spowoduje, że serwer zostanie zainstalowany globalnie w systemie, co pozwoli uruchomić go z każdego miejsca.
Uruchamianie
Aby uruchomić JSON Server, otwórz wiersz poleceń i wpisz jedno z poniższych poleceń (w zależności od tego, co jest źródłem danych):
W tym przypadku źródłem danych jest plik db.json znajdujący się na dysku, np.:
W kolejnym przypadku źródłem danych jest onlinowe REST API - JSONPlaceholder.
W ostatnim przypadku źródłem danych jest skrypt JavaScriptowy; korzystając z pliku JS zamiast JSON, można utworzyć dane programowo:
JSON Server można również osadzić we własnym skrypcie JavaScriptowym:
Routing
Domyślnie serwer zapewnia najpotrzebniejsze routingi. Zakładając, że uruchomiliśmy serwer, którego źródłem danych jest plik db.json
, to w przypadku posts
(plural routes) będą to:
GET /posts
GET /posts/1
POST /posts
PUT /posts/1
PATCH /posts/1
DELETE /posts/1
natomiast dla profile
(singular routes) mamy:
GET /profile
POST /profile
PUT /profile
PATCH /profile
Można również dodać inne routingi. W tym celu należy stworzyć plik routes.json
, np.:
Następnie uruchamiamy serwer, używając opcji --routes
lub -r
:
W wyniku tego otrzymujemy dodatkowe routingi:
/api/posts
odpowiadający/posts
/api/posts/1
odpowiadający/posts/1
/blog/posts/1/show
odpowiadający/posts/1
/blog/jsonplaceholder
odpowiadający/posts?title=jsonplaceholder
Właściwości
Żądania POST
, PUT
, PATCH
i DELETE
wykonywane na bazie, której źródłem jest plik json z dysku, modyfikują również zawartości tego pliku źródłowego; w przypadku innych źródeł, operacje działają na kopii schematu.
Poza wspomnianymi żądaniami JSON Server wspiera również GET
i OPTIONS
.
Wartości identyfikatora (id) nie są zmienne. Każda wartość id w body żądania PUT
lub PATCH
będzie ignorowana. Tylko wartość ustawiona w żądaniu POST
będzie respektowana, o ile nie jest już zajęta.
POST
, PUT
lub PATCH
powinien zawierać nagłówek Content-Type: application/json
, aby można było używać JSONa w body żądania. W przeciwnym przypadku w odpowiedzi otrzymamy 200 OK
, ale bez wprowadzania zmian do danych.
Można uzyskać dostęp do API z dowolnego miejsca za pomocą CORS i JSONP.
Domyślnie serwer uruchamia się na porcie 3000 localhosta: http://localhost:3000
.
Wiele domyślnych ustawień, np. delay
(dodaje opóźnienie odpowiedzi serwera), host
, port
, można nadpisać, tworząc własny plik konfiguracyjny json-server.json
, np.:
a następnie uruchomiając, serwer wskazując na ten plik, używając opcji --config
lub -c
:
Jeżeli plik konfiguracyjny będzie dokładnie nazywał się: json-server.json
, to zostanie on automatycznie załadowany podczas uruchamiania serwera, więc można pominąć opcję --config
lub -c
. Można również posłużyć się komendami wiersza poleceń, jakie zapewnia JSON Server; wystarczy wpisać w konsoli: json-server -h
lub json-server --help
, aby poznać dostępne opcje. Na przykład, żeby zmienić port, wystarczy wpisać:
Więcej informacji można znaleźć na stronie projektu.
Możliwości
JSON Server dostarcza wiele przydatnych funkcji na potrzeby mock API. Najważniejsze z nich to:
Wyszukiwanie pełnotekstowe
Aby umożliwić wyszukiwanie pełnotekstowe, do URI trzeba dodać opcjonalny parametr q
:
To zapytanie zwróci wszystkie posty, w których w jakimkolwiek polu pojawi się słowo “json”; w naszym przypadku będą to dwa posty.
Filtry
Można stosować filtry do zapytań, używając znaku ?
:
To zapytanie zwróci wszystkie posty, w których tytuł to “json-server”; w naszym przypadku będzie to jeden post.
Można również połączyć kilka filtrów, dodając ampersand między różnymi filtrami:
To zapytanie zwróci wszystkie posty, których tytułem jest “jsonplaceholder”, a autor to “also typicode”; w naszym przypadku będzie to jeden post. Należy zauważyć, że nazwisko autora jest zakodowane.
Aby dostać się do bardziej zagłębionych propertiesów, należy użyć .
(kropki):
To zapytanie zwróci wszystkie posty, których imieniem autorem jest “firstname”; w naszym przypadku będzie to jeden post.
Operatory
JSON Server oferuje także operatory logiczne, niezbędne do dalszego odfiltrowywania wyników. Można użyć _gte
i _lte
, np.:
otrzymując w odpowiedzi 11 postów od id=10 do id=20.
Można użyć _ne
, by wyłączyć wartość:
w odpowiedzi otrzymamy 49 postów od id=1 do id=50, z pominięciem postu o id=10.
Użycie _like
umożliwia przefiltrowanie po danym polu:
w odpowiedzi otrzymamy dwa posty, w których w polu tytuł pojawiło się słowo “json”.
Parametr _like
rozpoznaje również wyrażenia regularne (RegExp):
w odpowiedzi otrzymamy jeden post, w którym w polu tytuł znajduje się “ “ (spacja).
Stronicowanie
Domyślnie JSON Server umożliwia stronicowania z 10 elementami na stronie dzięki _page
:
w naszym przypadku to zapytanie zwróci 10 postów, od postu o id=11 do postu o id=20.
Domyślną liczbę elementów można zmienić, używając parametru _limit
:
w naszym przypadku to zapytanie zwróci 20 postów, od postu o id=21 do postu o id=40.
Wycinanie (slice)
Używając parametrów _start
i _end
lub _limit
można otrzymać określony zakres elementów:
w naszym przypadku oba zapytanie zwrócą 11 postów, od postu o id=21 do postu o id=31.
Sortowanie
JSON Server pozwala również zażądać posortowanych danych z API. Należy użyć parametrów _sort
i _order
dla określenia właściwości, którą chcesz sortować i jej kolejności (domyślnie kolejność jest rosnąca). Jeśli sortowanie odbywa się na polu tekstowym, to elementy będą sortowane alfabetycznie.
W naszym przypadku to zapytanie zwróci wszystkie elementy posortowane malejącą względem tytułu.
Baza danych
Wykonując zapytanie:
w odpowiedzi otrzymujemy całą aktualną bazę (snapshot):
Można również wykonać zrzut aktualnej zawartości bazy (snapshot) poprzez konsolę, w której uruchomiliśmy serwer. W tym celu w konsoli należy wpisać s
i nacisnąć Enter
. W odpowiedzi w konsoli otrzymamy np.:
a na dysku zostanie utworzony plik db-1485326956546.json
ze zrzutem bazy.
Homepage
Serwuje katalog ./public
lub zwraca domyślny plik index (który też można zastąpić własnym):
Źródła danych
Jak już wspomniałem wcześniej, istnieją trzy możliwe źródła danych. Jeżeli nie potrzebujemy wielu danych testowych, możemy utworzyć własny, nieskomplikowany plik jsonowy i użyć go jako źródło danych dla naszego serwera.
Jeżeli jednak chcemy dysponować większą liczbą danych testowych, a nie zależy nam dokładnie na tym, jakie one są, możemy wykorzystać gotowiec w postaci JSONPlaceholder. Jest to darmowy onlineowy serwis RESTowy wspierający testowanie i prototypowanie. Nieodzowny, kiedy chcemy wypróbować jakąś nową bibliotekę, stworzyć samouczek (tutorial) lub po prostu nauczyć się kolejnego narzędzia czy frameworka. Nie musimy się rejestrować ani niczego konfigurować JSONPlaceholder oferuje nam najczęściej wykorzystywane podstawowe API:
/posts
- 100 elementów/comments
- 500 elementów/albums
- 100 elementów/photos
- 5000 elementów/todos
- 200 elementów/users
- 10 elementów
Oferowane dane są relacyjne; np. posty mają id użytkownika, a komentarze - id postu. Dzięki czemu możemy budować zapytania zagnieżdżone:
w naszym przypadku to zapytanie zwróci 5 komentarzy dla postu o id=1, co dokładnie odpowiada zapytaniu:
Tak jak w przypadku każdego innego źródła danych, możemy wykonywać wszystkie podstawowe żądania: GET
, POST
, PUT
, PATCH
, DELETE
i OPTIONS
.
Aby nie musieć za każdym razem łączyć się ze zdalnym schematem (http://jsonplaceholder.typicode.com/db
), można przechwycić całą bazę i zapisać ją do pliku jsonowego poprzez wprowadzenie s
+ Enter
w konsoli, a następnie użyć takiego schematu jako nowego źródła danych.
Jeżeli jednak potrzebujemy większej ilości customowych danych testowych, należy je sobie odpowiednio wygenerować.
Generowanie danych
Jak dotąd dane wprowadzane były ręcznie lub brane ze zdalnego schematu, co działa dobrze dla większości zastosowań. Jednak, gdy trzeba będzie stworzyć bazę z większą ilością realistycznych danych, które pasują do naszego projektu, trzeba posłużyć się dodatkowymi narzędziami.
Faker.js
Pozwala na generowanie dużych ilości różnego rodzaju testowych danych i dobrze współpracuje z JSON Server.
Aby zainstalować moduł, otwórz konsolę i wpisz polecenie:
Teraz za pomocą faker.js możemy stworzyć skrypt do generowania 50 postów dla naszej aplikacji. Należy utworzyć plik JavaScript o nazwie users.js
, który eksportuje funkcję do generowania danych:
Używając dodatkowo biblioteki lodash, możemy sobie uprościć nasz generator:
Teraz możemy powiedzieć JSON Server, aby korzystał z tego generatora jako źródła danych:
teraz wchodząc na http://localhost:3000/users
, powinniśmy zobaczyć obiekt JSON z 10 fałszywymi użytkownikami, zawierającymi realistyczne dane, gotowe do natychmiastowego użycia, np.:
Zamiast ciągle na nowo generować dane, można wyeksportować raz wygenerowane dane do pliku json. W tym celu trzeba lekko zmodyfikować plik users.js
:
a następnie uruchomić następujące polecenie w konsoli:
Taki plik możemy użyć jako nowe źródło danych.
Faker.js może generować ogromną ilość różnego typu fałszywych danych, oprócz prostych nazw i numerów, warto więc przejrzeć jego API, aby zobaczyć, które dane odpowiadają potrzebom naszej aplikacji.
Casual
Oferuje podobną funkcjonalność co faker.js. Aby zainstalować moduł, otwórz konsolę i wpisz polecenie:
Nasz wcześniejszy przykład dla casual wyglądałby tak:
Przykładowy wygenerowany użytkownik wygada tak:
Casual również może generować dużą ilość różnego typu testowych danych, warto więc przejrzeć jego API, aby zobaczyć, które dane odpowiadają potrzebom twojej aplikacji.
Używanie API obu bibliotek w jest dość intuicyjne. Jak widać, większość funkcjonalności w casual i faker.js pokrywa się, natomiast niektóre się uzupełniają. Faker.js ma bardziej przejrzyste API. Jednak nic nie stoi na przeszkodzie, aby wykorzystać obie biblioteki naraz i jednocześnie korzystać z ich dobrodziejstw.
Podsumowanie
Teraz powinieneś być w stanie szybko i łatwo stworzyć własne mock API i dodać do niego potrzebne dane testowe. Jak widać, postawienie w pełni funkcjonalnego testowego REST API nie zajmuje dużo czasu, dzięki JSON Server i użytecznym generatorom danych, takim jak Faker.js i Casual. Te narzędzia mogą stać się nieodzowne w twojej pracy na frontendzie. Możesz zacząć pracę nad aplikacją bez czekania aż powstanie w miarę funkcjonalny, stabilny backend i szybciej przetestujesz nowe pomysły (prototypowanie). Będziesz mógł się zapoznać z nowymi narzędziami czy bibliotekami, a na dodatek nie musisz być online. Łatwiej porównasz również różne frameworki, dysponując spójnym i jednolitym restowym API.
Do pracy nad artykułem wykorzystano biblioteki i narzędzia w następujących wersjach:
- Node.js: 6.9.4 LTS
- Chrome: 55
- json-server: 0.9.4
- jsonplaceholder: 0.3.3
- faker.js: 3.1.0
- casual: 1.5.8
Autor: Łukasz Santarek
Programista, konsultant IT. Z wykształcenia elektronik, z zamiłowania informatyk. Interesuje się językami programowania, bazami danych oraz technikami i strategiami tworzenia oprogramowania. W pracy zajmuje się głównie Javą, a ostatnio również odnajduje się w tworzeniu aplikacji webowych, opartych głównie na Angularze. W wolnym czasie czyta beletrystykę i książki popularnonaukowe. Czasem można go spotkać w teatrze lub na leśnych szlakach.