コース一覧
Next.jsフルスタック:サーバー・データ取得・API
POST 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分

POST APIを作る

request.json() を待つ

受け取る側を書く

ここまでの GET は、こちらが持っているものを渡すだけでした。POST は逆で、送られてきたものを受け取ります。問い合わせも出品も、受け取る側は POST です。

書き方は GET と同じで、名前を POST にするだけです。違うのは、引数の request から中身を取り出す一手間が要ることです。

TypeScript

export async function POST(request: Request) { const body = await request.json(); return NextResponse.json({ message: body.name + " さん、ありがとうございます" }); }

request.json() は、送られてきた JSON を読み終わるまで待つので await を付けます。GET の searchParams が URL から読むのに対して、POST は本文から読む、という違いです。

送られてきたものを信じない

ここが POST のいちばん大事なところです。ブラウザのフォームを通ったかどうかに関係なく、誰でも好きな中身を送れます。名前が空でも、本文が無くても届きます。

だから受け取った直後に確かめます。おかしければ、保存せずに断ります。

TypeScript

if (!body.name || !body.body) { return NextResponse.json({ error: "名前と本文は必須です" }, { status: 400 }); }

NextResponse.json の第2引数で状態コードを指定できます。400 は「送られてきた内容がおかしい」という意味です。何も指定しなければ 200 になり、これは「うまくいった」という意味です。

受け取る側の合図を数字で返しておくと、ページ側は res.ok を見るだけで成功と失敗を分けられます。res.ok は状態コードが 200 番台なら true になります。

演習

app/api/contact/route.ts に、問い合わせを受け取る POST を書きます。

ヒント

export async function POST(request: Request) { ... } の形です

const body = await request.json(); で中身を取り出します。await を忘れると Promise のままです

NextResponse.json({ error: "名前と本文は必須です" }, { status: 400 }) の第2引数で状態コードを付けます

成功のときの文は body.name + " さんの問い合わせを受け付けました" です

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

できているか

  • 問い合わせフォームが出ている
  • 空のまま送ると断られる
  • そろっていれば受け付けられる
  • POST という名前で export している
  • 送られてきた本文を読んでいる
  • おかしい入力を 400 で断っている
エディタを読み込んでいます