JavaScript · API · Начальный
Пагинация
Перебирайте страницы ответов API для сбора всех результатов.
Краткое введение в тему и пояснения перед упражнениями (упражнения ниже):
Паттерны пагинации
#Справочник пагинации
#Упражнения:
Получить 2-ю страницу
#Получите 2-ю страницу `/api/products/` с помощью параметра `page`. Выведите количество результатов на этой странице и название первого товара.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// fetch 2-й страницы и вывести results.length + название первого товара
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
const params = new URLSearchParams({ page: 2 });
const response = await fetch(`${BASE_URL}/api/products/?${params}`);
const data = await response.json();
console.log(data.results.length);
console.log(data.results[0].name);
}
main();
Следовать по next для сбора всех страниц
#Напишите цикл, который переходит по `data.next`, пока он не станет `null`. Подсчитайте общее количество товаров на всех страницах и выведите результат.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let total = 0;
// цикл: fetch url, добавить к total, url = data.next
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let total = 0;
while (url) {
const response = await fetch(url);
const data = await response.json();
total += data.results.length;
url = data.next;
}
console.log(total);
}
main();
Собрать все товары в массив
#Напишите функцию `getAllProducts()`, которая пагинирует все страницы с `page_size=100` и возвращает плоский массив всех товаров. Выведите общую длину.
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAllProducts() {
// пагинация с page_size=100, вернуть плоский массив
}
async function main() {
const all = await getAllProducts();
console.log(all.length);
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAllProducts() {
let url = `${BASE_URL}/api/products/?page_size=100`;
const all = [];
while (url) {
const response = await fetch(url);
const data = await response.json();
all.push(...data.results);
url = data.next;
}
return all;
}
async function main() {
const all = await getAllProducts();
console.log(all.length);
}
main();
Найти самый дорогой товар
#Загрузите все товары (пагинируйте все страницы), затем найдите тот с наибольшей ценой. Выведите его название и цену.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// собрать все товары по страницам
// найти самый дорогой
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/?page_size=100`;
const all = [];
while (url) {
const response = await fetch(url);
const data = await response.json();
all.push(...data.results);
url = data.next;
}
const mostExpensive = all.reduce((max, p) =>
parseFloat(p.price) > parseFloat(max.price) ? p : max
);
console.log(mostExpensive.name, mostExpensive.price);
}
main();
Подсчёт товаров на каждой странице
#Получите все страницы `/api/products/` с размером страницы по умолчанию. Для каждой выведите `"Страница N: X товаров"`. В конце выведите общую сумму.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let page = 1;
let total = 0;
// перебирать страницы и выводить информацию
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let page = 1;
let total = 0;
while (url) {
const response = await fetch(url);
const data = await response.json();
console.log(`Page ${page}: ${data.results.length} products`);
total += data.results.length;
url = data.next;
page++;
}
console.log(`Total: ${total} products across ${page - 1} pages`);
}
main();