← inaro.devAI駆動開発 学習ツール
中級

Route Handler

なぜ学ぶか: 「APIキーを使って外部サービスを呼びたい。でもキーをブラウザに置いたら盗まれる」— この定番問題の答えがRoute Handlerです。app/api/に置く「自分専用のAPI窓口」を、例で見てください。

まずはこの例を見てみましょう

// app/api/greet/route.ts → /api/greet という「自分のAPI」になる
export async function GET() {
  // ここはサーバー: 秘密のキーを使っても、ブラウザには漏れない
  const apiKey = process.env.SECRET_API_KEY;

  // (ここでキーを使って外部サービスを呼ぶ…)

  return Response.json({ message: "こんにちは" }); // 結果だけ返す
}

ブラウザ → 自分のAPI(/api/greet)→ 外部サービス。秘密のキーはサーバーから一歩も出ません。

Route Handler=自作のAPI

例のようにapp/api/greet/route.tsにGETやPOSTを書くと、/api/greetというURLのAPIになります。page.tsxの「API版」です。

サーバーで動く=秘密を扱える

Route Handlerの中は常にサーバー。APIキーを使っても、ブラウザに渡るのは「処理結果」だけです。

レビューの最重要ポイント

AIがブラウザ側から秘密キー付きで外部APIを直接呼んでいたら重大事故です。「Route Handler経由に」が必須の指摘です。

コード例

// app/api/greet/route.ts — /api/greet という API になる
import { NextResponse } from "next/server";

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const name = searchParams.get("name") ?? "ゲスト";

  // ここはサーバー: 秘密のキーを使っても漏れない
  // const apiKey = process.env.SECRET_API_KEY;

  return NextResponse.json({ message: `こんにちは、${name}さん` });
}

期待される出力

GET /api/greet?name=Ada への応答:
{ "message": "こんにちは、Adaさん" }

route.tsはページではなく「APIの窓口」。ブラウザ → /api/greet → サーバー処理 → JSON応答、という流れで、秘密はサーバー側に留まります。

ステップ 1 / 2

※ カリキュラムの内容はAIが生成しており、誤りが含まれる場合があります。正確な情報は公式ドキュメント等でご確認ください。