コース一覧
Next.jsフルスタック:サーバー・データ取得・API
GET APIを作る

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

GET APIを作る

呼ばれる→取り出す→JSON で返す

一覧を返す API

前回の /api/health は、決まった1つの値を返すだけでした。今回は fleama の商品一覧を返す /api/items を作ります。返すものが配列になるだけで、書き方は同じです。

TypeScript

import { NextResponse } from "next/server"; const ITEMS = [ { id: "1", title: "スニーカー", price: 4800, category: "shoes" }, ]; export async function GET() { return NextResponse.json(ITEMS); }

NextResponse.json は配列でもオブジェクトでもそのまま JSON にします。受け取ったページ側は await res.json() で配列として使えます。

絞り込みの条件を受け取る

API は「全部ください」以外の呼ばれ方もします。fleama なら「靴だけください」です。この条件は URL のうしろに ?category=shoes の形で付きます。

受け取るには、GET の第1引数の request を使います。request.url にはリクエストされた URL がまるごと入っているので、URL に渡して searchParams から読みます。

TypeScript

export async function GET(request: Request) { const category = new URL(request.url).searchParams.get("category"); const shown = category ? ITEMS.filter((item) => item.category === category) : ITEMS; return NextResponse.json(shown); }

searchParams.get は、その名前が付いていなければ null を返します。だから category があるときだけ絞り、無ければ全部返す、という書き分けになります。

ページ側は変わらない

呼ぶ側は fetch("/api/items") と fetch("/api/items?category=shoes") を使い分けるだけです。API の中身が増えても、ページの書き方は同じままです。

どこまでを API の仕事にして、どこからをページの仕事にするかは設計の話です。今回のように「絞り込みは API 側」にしておくと、あとでデータが1万件になっても、ページに全部を送らずに済みます。

演習

app/api/items/route.ts に、商品一覧を返す GET を書きます。

ヒント

new URL(request.url).searchParams.get("category") で条件を読めます

絞り込みは ITEMS.filter((item) => item.category === category) です

条件が無いときは null が返るので、三項演算子で全件と絞り込みを切り替えます

route.ts
layout.tsx
page.tsx
プレビュー

できているか

  • 全件を返す GET が動いている
  • 商品名が届いている
  • 価格も届いている
  • category=shoes で2件に絞れている
  • URL の条件を読んでいる
  • NextResponse.json で返している
エディタを読み込んでいます