如何从分页的 API 中获取下一组结果?

How to fetch the next set of results from a paginated API?

我正在从服务器端分页的 API 中获取数据。我已将结果数限制为 5(行 = 5)。对于第一组数据,已将全局变量 pageNumber 声明为 1,并添加了 Previous/Next 按钮的 eventListeners。现在我不知道如何获得下一组结果。可以通过将 pageNumber 更改为 2 来获取它们,但我不知道如何从 const 端点访问 URL,我会在其中更改 pageNumber 参数以获得先前的 and/or 下一个结果。知道怎么做吗?

// First set of fetched data starts with page 1
let pageNumber = 1;

// 1. Define endpoint, fetch response and return data promise
const search = async (term) => {
    const key = 'aroplosuitin';

    const endpoint = `https://api.europeana.eu/record/v2/search.json`,
        query = `?wskey=${key}&query=${term}&start=${pageNumber}&rows=5&profile=rich'`;

    const response = await fetch(endpoint + query);

    // Check response status:
    if (response.status !== 200) {
        throw new Error('Cannot fetch data. Response status is not 200.');
    }

    const data = await response.json();

    return data;
};

// 2. Call search and return data promise
const searchEuropeana = async (term) => {
    const data = await search(term);

    return data;
};

// 3. Grab the input and invoke callback to update the UI
const searchForm = document.querySelector('#search-form');

searchForm.addEventListener('submit', (e) => {
    e.preventDefault();

    // grab user input
    const userInput = searchForm.search.value.trim();
    // reset form on submit
    searchForm.reset();

    // For errors
    const errorOutput = document.querySelector('.error');

    // Invoke searchEuropeana
    searchEuropeana(userInput)
        .then((data) => {
            updateUI(data);
            console.log(data);
        })
        .catch((error) => {
            console.log('An error occured:', error),
                (errorOutput.innerText = 'Check your spelling or network.');
        });
});

// 4. Update the UI with HTML template
const updateUI = (data) => {
    console.log(data);
};

// 5. Previous / Next results
const previousBtn = document.querySelector('#previousBtn'),
    nextBtn = document.querySelector('#nextBtn');

previousBtn.addEventListener('click', () => {
    if (pageNumber > 1) {
        pageNumber--;
    } else {
        return;
    }
    console.log(pageNumber);
    searchEuropeana();
});

nextBtn.addEventListener('click', () => {
    pageNumber++;
    console.log(pageNumber);
    searchEuropeana();
});
        <main id="main">
                <h2>(Be)Heading</h2>
                <br>
                <section id="search">
                    <form id="search-form">
                        <div class="form-group search-group">
                            <input type="text" name="search" id="search" required>

                            <button id="searchButton" class="btn" type="submit">Search</button>
                        </div>
                    </form>
                </section>

                <br>

                <section id="output">
                    <!-- Error messages -->
                    <div class="error"></div>
                </section>        
                
                <button id="previousBtn" class="btn" type="submit">Previous</button>
                <button id="nextBtn" class="btn" type="submit">Next</button>
        </main>

// First set of fetched data starts with page 1
let pageNumber = 1;
let term = '';

// 1. Define endpoint, fetch response and return data promise
const search = async () => {
    const key = 'aroplosuitin';

    const endpoint = `https://api.europeana.eu/record/v2/search.json`,
        query = `?wskey=${key}&query=${term}&start=${pageNumber}&rows=5&profile=rich'`;

    const response = await fetch(endpoint + query);

    // Check response status:
    if (response.status !== 200) {
        throw new Error('Cannot fetch data. Response status is not 200.');
    }

    const data = await response.json();

    return data;
};

// 2. Call search and return data promise
const searchEuropeana = async () => {
    const data = await search();

    return data;
};

// 3. Grab the input and invoke callback to update the UI
const searchForm = document.querySelector('#search-form');

searchForm.addEventListener('submit', (e) => {
    e.preventDefault();

    // grab user input
    term = searchForm.search.value.trim();
    // reset form on submit
    searchForm.reset();

    // For errors
    const errorOutput = document.querySelector('.error');

    // Invoke searchEuropeana
    searchEuropeana()
        .then((data) => {
            updateUI(data);
            console.log(data);
        })
        .catch((error) => {
            console.log('An error occured:', error),
                (errorOutput.innerText = 'Check your spelling or network.');
        });
});

// 4. Update the UI with HTML template
const updateUI = (data) => {
    console.log(data);
};

// 5. Previous / Next results
const previousBtn = document.querySelector('#previousBtn'),
    nextBtn = document.querySelector('#nextBtn');

previousBtn.addEventListener('click', () => {
    if (pageNumber > 1) {
        pageNumber--;
    } else {
        return;
    }
    console.log(pageNumber);
    searchEuropeana();
});

nextBtn.addEventListener('click', () => {
    pageNumber++;
    console.log(pageNumber);
    searchEuropeana();
});

编辑:

看看更易读的方法

// First set of fetched data starts with page 1

const searchFormEl = document.querySelector("#search-form");
const errorEl = document.querySelector(".query");
const nextBtn = document.querySelector("#nextBtn");
const prevBtn = document.querySelector("#previousBtn");
const searchEl = document.querySelector("#search");
let pageNumber = 1;

const getApiUrl = () => {
  const key = "aroplosuitin";
  const endPoint = `https://api.europeana.eu/record/v2/search.json`;
  const query = `?wskey=${key}&query=${searchEl.value.trim()}&start=${pageNumber}&rows=5&profile=rich'`;
  return `${endPoint}${query}`;
};

// 1. Define endpoint, fetch response and return data promise
const search = async () => {
  const response = await fetch(getApiUrl());

  // Check response status:
  if (response.status !== 200) {
    throw new Error("Cannot fetch data. Response status is not 200.");
  }

  const data = await response.json();

  return data;
};

// 2. Call search and return data promise
const searchEuropeana = async () => await search();

// 3. Grab the input and invoke callback to update the UI

searchFormEl.addEventListener("submit", (e) => {
  e.preventDefault();

  // Invoke searchEuropeana
  searchEuropeana()
    .then((data) => {
      updateUI(data);
      console.log(data);
      searchFormEl.reset();
    })
    .catch((error) => {
      console.log("An error occured:", error);
      errorEl.innerText = "Check your spelling or network.";
    });
});

// 4. Update the UI with HTML template
const updateUI = (data) => {
  console.log(data);
};

prevBtn.addEventListener("click", () => {
  pageNumber = pageNumber > 1 ? pageNumber - 1 : pageNumber;
  searchEuropeana().then(updateUI);
});

nextBtn.addEventListener("click", () => {
  pageNumber++;
  searchEuropeana().then(updateUI);
});