Ինչպես կառուցել և սպառել API Next.js-ում


Անցեք վերջից մինչև վերջ այս ձեռնարկով, որն ընդգրկում է API-ի պարզ ճանապարհորդության յուրաքանչյուր մասը:

Անցել են այն ժամանակները, երբ դուք պետք է ստեղծեիք ձեր վեբ կայքի համար առանձին հետին պլան: Next.js ֆայլի վրա հիմնված API երթուղղման միջոցով դուք կարող եք հեշտացնել ձեր կյանքը՝ գրելով ձեր API-ն Next.js նախագծի ներսում:

Next.js-ը React մետա-շրջանակ է, որն ունի առանձնահատկություններ, որոնք հեշտացնում են արտադրության համար պատրաստ վեբ հավելվածների ստեղծման գործընթացը: Դուք կտեսնեք, թե ինչպես կարելի է կառուցել REST API Next.js-ում և սպառել այդ API-ի տվյալները Next.js էջում:

Ստեղծեք Next.js նախագիծ՝ օգտագործելով create-next-app-ը

Դուք կարող եք ստեղծել նոր Next.js նախագիծ՝ օգտագործելով create-next-app CLI գործիքը: Այն տեղադրում է անհրաժեշտ փաթեթներն ու ֆայլերը, որպեսզի սկսեք ստեղծել Next.js հավելված:

Գործարկեք այս հրամանը տերմինալում՝ նոր Next.js թղթապանակ ստեղծելու համար, որը կոչվում է api-routes: Դուք կարող եք հաղորդագրություն ստանալ՝ տեղադրել ստեղծելու հաջորդ հավելվածը:

npx create-next-app api-routes

Երբ հրամանն ավարտվի, բացեք api-routes պանակը, որպեսզի սկսեք ստեղծել API երթուղիները:

API-ի ուղղորդում Next.js-ում

API-ի երթուղիներն աշխատում են սերվերի վրա և ունեն բազմաթիվ կիրառություններ, ինչպիսիք են օգտատերերի տվյալները տվյալների բազայում պահելը կամ API-ից տվյալներ ստանալն առանց CORS քաղաքականության սխալի բարձրացման:

Next.js-ում դուք պետք է ստեղծեք API երթուղիներ /pages/api պանակում: Next.js-ը ստեղծում է API վերջնակետեր այս թղթապանակի յուրաքանչյուր ֆայլի համար: Եթե ավելացնեք user.js-ը /pages/api-ին, Next.js-ը վերջնակետ կստեղծի http://localhost:3000/api/user հասցեում:

Next.js API-ի հիմնական երթուղին ունի հետևյալ շարահյուսությունը.

export default function handler(req, res) {
  res.status(200).json({ name: 'John Doe' })
}

Դուք պետք է արտահանեք կարգավորիչի գործառույթը, որպեսզի այն աշխատի:

API երթուղիների ստեղծում

Ստեղծեք նոր ֆայլ, որը կոչվում է todo.js /pages/api պանակում՝ todo տարրերի համար API երթուղի ավելացնելու համար:

Ծաղրել Todo տվյալների բազան

Todos-ը ստանալու համար դուք պետք է ստեղծեք GET վերջնակետ: Պարզության համար: Այս ձեռնարկը տվյալների բազայի փոխարեն օգտագործում է todo տարրերի զանգված, բայց ազատ զգացեք օգտագործել տվյալների բազա, ինչպիսին է MongoDB կամ MySQL:

Ստեղծեք todo տարրերը todo.js-ում ձեր հավելվածի արմատային պանակում, այնուհետև ավելացրեք հետևյալ տվյալները:

export const todos = [
  {
    id: 1,
    todo: "Do something nice for someone I care about",
    completed: true,
    userId: 26,
  },
  {
    id: 2,
    todo: "Memorize the fifty states and their capitals",
    completed: false,
    userId: 48,
  },
  // other todos
];

Այս todo տարրերը DummyJSON կայքից են, REST API կեղծ տվյալների համար: Դուք կարող եք գտնել ճշգրիտ տվյալներ այս DummyJSON todos վերջնակետից:

Հաջորդը, ստեղծեք API-ի երթուղին /pages/api/todos.js-ում և ավելացրեք կարգավորիչի գործառույթը:

import { todos } from "../../todo";
 
export function handler(req, res) {
  const { method } = req;
 
  switch (method) {
    case "GET":
      res.status(200).json(todos);
      break;
    case "POST":
      const { todo, completed } = req.body;
      todos.push({
        id: todos.length + 1,
        todo,
        completed,
      });
      res.status(200).json(todos);
      break;
    default:
      res.setHeader("Allow", ["GET", "POST"]);
      res.status(405).end(`Method ${method} Not Allowed`);
      break;
  }
}

Այս երթուղին մշակում է GET և POST վերջնակետերը: Այն վերադարձնում է GET խնդրանքի բոլոր գործերը և POST հարցման համար todo տարր է ավելացնում todo տվյալների բազայում: Այլ մեթոդների դեպքում մշակողը վերադարձնում է սխալ:

Սպառելով API երթուղիները Frontend-ում

Դուք ստեղծել եք API վերջնակետ, որը վերադարձնում է JSON օբյեկտ, որը պարունակում է todos զանգված:

API-ն սպառելու համար ստեղծեք ֆունկցիա, որը կոչվում է fetchTodos, որը տվյալներ է առբերում API-ի վերջնակետից: Ֆունկցիան օգտագործում է առբերման մեթոդը, բայց դուք կարող եք նաև օգտագործել Axios-ը՝ API հարցումներ կատարելու համար: Այնուհետև զանգահարեք այս գործառույթը, երբ սեղմում եք որևէ կոճակ:

import Head from "next/head";
import { useState } from "react"; 
 
export default function Home() {
  const [todos, settodos] = useState([]);
 
  const fetchTodos = async () => {
    const response = await fetch("/api/todos");
    const data = await response.json();
    settodos(data);
  };
 
  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main>
        <button onClick={fetchTodos}>Get todos</button>
        <ul>
          {todos.map((todo) => {
            return (
              <li
                style={{ color: `${todo.completed ? "green" : "red"}` }}
                key={todo.id}
              >
                {todo.todo}:{todo.completed}.
              </li>
            );
          })}
        </ul>
      </main>
    </div>
  );
}

Այս հատվածի ցանկը ցուցադրում է անելիքները, երբ դրանք առբերվում են:

POST վերջնակետի համար ստեղծեք նոր ֆունկցիա, որը կոչվում է saveTodo, որը POST հարցում է կատարում API-ին: Fetch հարցումը պահում է նոր todo տարրը մարմնի մեջ և վերադարձնում է բոլոր todo տարրերը, ներառյալ նորը: SaveTodo ֆունկցիան այնուհետև դրանք պահում է todos վիճակում:

const saveTodo = async () => {
    const response = await fetch("/api/todos", {
        method: "POST",
        body: JSON.stringify(newTodo),
        headers: {
            "Content-Type": "application/json",
        },
    });
 
    const data = await response.json();
    settodos(data);
};

Այնուհետև ստեղծեք ձև տեքստի մուտքագրման տողով, որպեսզի ստանաք նոր տարրը: Այս ձևի submit handler ֆունկցիան կանվանի saveTodo ֆունկցիան:

import Head from "next/head";
import { useReducer, useState } from "react";
import styles from "../styles/Home.module.css";
 
export default function Home() {
  const [todos, settodos] = useState([]);
 
  const [newTodo, setnewTodo] = useState({
    todo: "",
    completed: false,
  });
 
  const fetchTodos = async () => {
    // fetchTodos
  };
  const saveTodo = async (e) => {
    const response = await fetch("/api/todos", {
      method: "POST",
      body: JSON.stringify(newTodo),
      headers: {
        "Content-Type": "application/json",
      },
    });
 
    const data = await response.json();
    settodos(data);
  };
 
  const handleChange = (e) => {
    setnewTodo({
      todo: e.target.value,
    });
  };
 
  const handleSubmit = (e) => {
    e.preventDefault();
    saveTodo();
    setnewTodo({
      todo: '',
    });
  };
 
  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main>
 // Fetches the todo items when clicked
        <button onClick={fetchTodos}>Get todos</button>
 
 // Saves a new todo item when submitted
        <form onSubmit={handleSubmit}>
          <input type="text" onChange={handleChange} value={newTodo.todo} />
        </form>
        <ul>
          {// list todo items}
        </ul>
      </main>
    </div>
  );
}

Բեռնարկղը յուրաքանչյուր անգամ, երբ օգտատերը ձևը ներկայացնում է տվյալների բազայում, ավելացնում է նոր գործ: Բացի այդ, այս ֆունկցիան թարմացնում է todos արժեքը՝ օգտագործելով API-ից ստացված տվյալները, որն իր հերթին ավելացնում է նոր todo տարրը ցանկում:

API-ի ուղղորդումը Next.js-ի ուժեղ կողմերից մեկն է

Դուք տեսել եք, թե ինչպես եք կառուցում և օգտագործում Next.js API երթուղին: Այժմ դուք կարող եք ստեղծել ամբողջական փաթեթ հավելված՝ առանց ձեր Next.js նախագծի թղթապանակից դուրս գալու: API-ի երթուղավորումը Next.js-ի տրամադրած բազմաթիվ առավելություններից մեկն է:

Next.js-ն առաջարկում է նաև կատարողականի օպտիմալացումներ, ինչպիսիք են կոդի բաժանումը, ծույլ բեռնումը և ներկառուցված CSS աջակցությունը: Եթե դուք կառուցում եք կայք, որը պետք է լինի արագ և բարենպաստ SEO-ի համար, պետք է հաշվի առնել Next.js-ը: