Zapisy otwarte! Dołącz do kursu Selenium w Javie lub Selenium w C#. Tylko do 23.09.2021 do godz. 21:00. Zapisz się tutaj.

API w REST Assured 10. Jak szperać w JSONie?

W tej przyjemnej lekcji zobaczysz jak wyciągać konkretne dane z JSONa, a nie całą odpowiedź. Wspomnę też o XML, bo JSON w REST Assured nie jest jedyną słuszną opcją.

Dokumentacja do sklepu

Po poprawnym postawieniu aplikacji dokumentację do niej znajdziesz pod localhost/fakestore/dokumentacja/. Tam też znajdziesz np. klucze potrzebne do uwierzytelnienia.

Wersja Javy

W zależności od tego której wersji Javy używasz, mogą się pojawić drobne rozbieżności w sytuacji, w których pobieramy jakąś informację z odpowiedzi metodą get(), a następnie ją „wypluwamy” w konsoli metodą println, np.:

System.out.println(response.jsonPath().get("name"));

Jeżeli nie zadziała Ci to, co pokazuję (będzie się podkreślało na czerwono i po najechaniu zobaczysz „Ambiguous method call”) możesz zamiast get() użyć metody getString():

System.out.println(response.jsonPath().getString("name"));

JSON w REST Assured

JSON czyli JavaScript Object Notation to lekki format przechowywania i przesyłania danych. Bardzo często jest wykorzystywany kiedy serwer wysyła dane do strony internetowej (czyli backend komunikuje się z frontendem) i co jest bardzo wygodne jest samo-opisujący się i łatwy do zrozumienia. Żeby pracować z JSONami warto zapamiętać kilka poniższych zasad semantycznych (za w3schools.com):

  • dane składają się z par: nazwa/wartość,
  • dane są rozdzielone przecinkami,
  • nawiasy klamrowe (wąsiaste) przechowują obiekty,
  • nawiasy kwadratowe przechowują listy (array).

Używamy i oglądamy go od naszego pierwszego requestu do API, ale warto w końcu powiedzieć kilka słów więcej o tym co i jak możemy wykorzystywać, żeby ułatwić sobie życie. 

Wyciąganie informacji z odpowiedzi

REST Assured umożliwia proste parsowanie danych w formatach JSON i XML – czyli tych, w jakich zdarza się, że RESTowe API dostarczają danych. Nasz Sztucznosklep dostarcza danych w formacie JSON i to tym formatem zajmiemy się w większości. 

*Dla osób które znają XPath mam dwie rady. W większości przypadków wystarczy, że zamiast „/” podamy „.” oraz na początku nie dajemy „/” ani „//”. Znający XPath mogą już dalej nie czytać – wiecie wszystko, co Wam potrzebne do trawersowania obiektów 🙂 

Rozczytywanie naszych odpowiedzi oraz wyciąganie tylko tych informacji, których potrzebujemy odbywa się poprzez metodę get(), w której parametrze podajemy ścieżkę, do informacji, którą chcemy pozyskać. Czyli zamiast pobierać całe ciało odpowiedzi, a potem manipulować tekstem możemy od razu wyciągnąć to, czego potrzebujemy, czyli np. jakieś id.

W parametrze metody get() podajemy ścieżkę w składni GPath. Więcej o GPath i o tym jak wygląda jego składnia znajdziesz tutaj, ale bardzo krótko wyjaśniam to też poniżej.

GPath

Ścieżki w GPath działają bardzo podobnie do ścieżek absolutnych w XPath. Są hierarchiczne, czyli idą niejako „od góry”, od minimalnego wcięcia jeżeli mówimy o JSONie. Popatrz na poniższy przykład, który znajduje się w dokumentacji do REST Assured.

{
"lotto":{
 "lottoId":5,
 "winning-numbers":[2,45,34,23,7,5,3],
 "winners":[{
   "winnerId":23,
   "numbers":[2,45,34,23,3,5]
 },{
   "winnerId":54,
   "numbers":[52,3,12,11,18,22]
 }]
}
}

Jakiego GPatha musielibyśmy stworzyć i przekazać do metody get(), żeby dostać z tej metody wartość 5, czyli lottoId? Będzie to „lotto.lottoId”, bo zaczynając od samej góry zaraz po pierwszym otwierającym nawiasie klamrowym mamy „lotto”, które jest obiektem – za nim znowu mamy nawiasy klamrowe. W tym obiekcie szukamy „lottoId”. Właśnie ta kropka pomiędzy jednym a drugim będzie nam mówiła o zależności.

A co się stanie, gdy poprosimy tylko o „lotto”? Wtedy zwrócona zostanie nam nie wartość, a cały obiekt wraz z informacjami, które znajdują się w nawiasie klamrowym po „lotto”. 

A co jeżeli będziemy chcieli zwrócić „winnerId”? Zwróć uwagę, że mamy takie dwa, w związku z czym w odpowiedzi na „lotto.winners.winnerId” dostaniemy kolekcję (ArrayList). To super fajny sposób sięgania po listę pojedynczych wartości, zamiast konieczności wyciągania wielu, całych obiektów – polecam! A co jeżeli chcemy dobrać się np. tylko do winnerId pierwszego obiektu? Możemy to ogarnąć już w samym GPathie. Wtedy się trzeba posłużyć indeksem i takie coś pokazuję na filmie. Te indeksy to także coś podobnego do indeksów w XPathie trzeba jednak pamiętać, że tak jak w XPathie indeksy podajemy od 1, tak tutaj w GPathie już „normalnie” – od 0.

Jeszcze jedna zagadka: co nam zwróci „lotto.winners”?. A no po prostu kolekcję dwóch obiektów, bo mamy dwóch zwycięzców: jednego o id 23, a drugiego o id 54.

Atrybuty w XML

Na filmie pokazuję też w przypadku XMLa konstrukcję z małpą (@). JSON jest w dużym uproszczeniu zbiorem par klucz-wartość. XML natomiast ma jeszcze atrybuty. Popatrz na poniższy przykład, który jest jedną z możliwości odwzorowania podanych wcześniej informacji w XMLu. Dodane zostały imiona i nazwiska zwycięzców.

<lotto lottoId="5" winning-numbers="2 45 34 23 7 5 3">
  <winner winnerId="23" numbers="2 45 34 23 3 5">Jan Nowak</winner>
  <winner winnerId="54" numbers="52 3 12 11 18 22">Ola Kowalska</winner>
</lotto>

Co dostaniemy w takim przypadku jeżeli użyjemy „lotto.winner[0]”? Dostaniemy imię i nazwisko pierwszego zwycięzcy, czyli „Jan Nowak”. A co gdybyśmy chcieli pobrać jego winnerId? Właśnie wtedy potrzebujemy @, bo winnerId jest atrybutem elementu winner.

Więcej informacji o GPath znajdziesz tutaj.

Wsparcie merytoryczne

Nie masz dostępu do wsparcia merytorycznego dla tego kursu. Wykup dostęp albo zaloguj się, by móc zadawać pytania.