Як разабраць адказ JSON з упэўненасцю REST

У гэтым падручніку па тэставанні API мы разгледзім, як прааналізаваць адказ JSON і здабыць інфармацыю з выкарыстаннем гарантаванай REST бібліятэкі.

Пры тэставанні API вы звычайна робіце запыт на рэсурс (напрыклад, праз запыт GET або POST). Сервер вяртаецца з адказам, а потым вы робіце некалькі сцвярджэнняў наконт адказу.



Як разабраць адказ JSON

Для гэтага ўроку я буду карыстацца JSONPlaceholder які з'яўляецца падробленым Інтэрнэт-REST API для тэставання і прататыпавання. JSONPlaceholder - гэта бясплатная Інтэрнэт-паслуга REST, якой вы можаце карыстацца, калі вам патрэбныя падробныя дадзеныя.


Больш канкрэтна, я буду выкарыстоўваць канчатковую кропку карыстальнікаў jsonplaceholder .

Запыт і адказ

Калі мы робім запыт GET на вышэйзгаданы рэсурс, мы атрымліваем адказ JSON, які змяшчае спіс карыстальнікаў. Гэты спіс прадстаўлены ў выглядзе масіва JSON. Кожны масіў мае наступную структуру:


{
id: 1,
name: 'Leanne Graham',
username: 'Bret',
email: 'Sincere@april.biz',
address: {
street: 'Kulas Light',
suite: 'Apt. 556',
city: 'Gwenborough',
zipcode: '92998-3874',
geo: {

lat: '-37.3159',

lng: '81.1496'
}
},
phone: '1-770-736-8031 x56442',
website: 'hildegard.org',
company: {
name: 'Romaguera-Crona',
catchPhrase: 'Multi-layered client-server neural-net',
bs: 'harness real-time e-markets'
} }

Такім чынам, у поўным адказе ў масіве будзе дзесяць запісаў, кожны з якіх мае аднолькавую структуру JSON, але з рознымі значэннямі.

Звязаныя:

Зараз пачнем з разбору і вылучэння некаторых значэнняў з JSON.

Першы тэст звычайна заключаецца ў падліку колькасці запісаў у масіве, таму пачнем з гэтага.


import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.parsing.Parser; import io.restassured.response.Response; import java.util.List; import static io.restassured.RestAssured.given; public class RestTest {
public static Response doGetRequest(String endpoint) {
RestAssured.defaultParser = Parser.JSON;

return

given().headers('Content-Type', ContentType.JSON, 'Accept', ContentType.JSON).


when().get(endpoint).


then().contentType(ContentType.JSON).extract().response();
}
public static void main(String[] args) {
Response response = doGetRequest('https://jsonplaceholder.typicode.com/users');

List jsonResponse = response.jsonPath().getList('$');

System.out.println(jsonResponse.size());
} }

У выніку вышэйзгаданага выкліку будзе надрукавана 10. Звярніце ўвагу на $ абазначэнне, якое азначае каранёвы элемент.

Разбор масіваў і спісаў JSON

У прыведзеным вышэй прыкладзе, калі мы хацелі атрымаць імя карыстальніка для ўсіх запісаў, мы маглі б выкарыстаць:

String usernames = response.jsonPath().getString('username'); System.out.println(usernames);

Гэта будзе надрукаваць масіў, як:

[Bret, Antonette, Samantha, Karianne, Kamren, Leopoldo_Corkery, Elwyn.Skiles, Maxime_Nienow, Delphine, Moriah.Stanton]

Калі мы хочам атрымаць імя карыстальніка першага запісу, мы маглі б выкарыстаць:


String usernames = response.jsonPath().getString('username[0]');

Гэта надрукуе першае імя карыстальніка:

Bret

Выкарыстоўваючы спіс, мы можам выкарыстоўваць:

List jsonResponse = response.jsonPath().getList('username'); System.out.println(jsonResponse.get(0));

Гэта надрукуе першае імя карыстальніка:

Bret

Разбор JSON ArrayList і HashMap

Гледзячы на ​​вышэйзгаданую структуру JSON, кампанія на самай справе з'яўляецца картай. Калі б у нас быў толькі адзін запіс, мы маглі б выкарыстаць:


Response response = doGetRequest('https://jsonplaceholder.typicode.com/users/1'); Map company = response.jsonPath().getMap('company'); System.out.println(company.get('name'));

які будзе друкаваць:

Romaguera-Crona

Але калі адказ вяртае масіў, і мы хочам атрымаць першае імя кампаніі, мы маглі б выкарыстаць:

Response response = doGetRequest('https://jsonplaceholder.typicode.com/users/'); Map company = response.jsonPath().getMap('company[0]'); System.out.println(company.get('name'));

У якасці альтэрнатывы мы маглі б выкарыстоўваць:

Response response = doGetRequest('https://jsonplaceholder.typicode.com/users/'); List companies = response.jsonPath().getList('company'); System.out.println(companies.get(0).get('name'));

абодва з іх надрукуюць:


Romaguera-Crona