APIルート
補足: App Routerを使用している場合、APIルートの代わりにサーバーコンポーネントまたはルートハンドラを使用できます。
APIルートは、Next.jsで公開APIを構築するためのソリューションを提供します。
pages/api
フォルダー内のファイルは/api/*
にマッピングされ、page
ではなくAPIエンドポイントとして扱われます。サーバーサイド専用のバンドルであり、クライアントサイドのバンドルサイズを増やしません。
例えば、次のAPIルートは200
のステータスコードを持つJSONレスポンスを返します:
補足:
- APIルートはCORSヘッダーを指定しません。つまり、デフォルトでは同一オリジン専用です。CORSリクエストヘルパーでリクエストハンドラをラップすることで、そのような動作をカスタマイズできます。
- APIルートは静的エクスポートでは使用できません。ただし、App Routerのルートハンドラは可能です。
- APIルートは
next.config.js
のpageExtensions
設定の影響を受けます。
- APIルートは
パラメータ
req
: http.IncomingMessageのインスタンスres
: http.ServerResponseのインスタンス
HTTPメソッド
APIルートで異なるHTTPメソッドを処理するには、リクエストハンドラでreq.method
を使用できます:
リクエストヘルパー
APIルートは、受信リクエスト(req
)を解析するための組み込みリクエストヘルパーを提供します:
req.cookies
- リクエストで送信されたCookieを含むオブジェクト。デフォルトは{}
req.query
- クエリ文字列を含むオブジェクト。デフォルトは{}
req.body
-content-type
で解析された本文を含むオブジェクト、または本文が送信されていない場合はnull
カスタム設定
すべてのAPIルートは、デフォルト設定を変更するためのconfig
オブジェクトをエクスポートできます:
bodyParser
は自動的に有効になります。本文をStream
またはraw-body
で使用する場合は、false
に設定できます。
自動bodyParsing
を無効にする1つのユースケースは、例えばGitHubからのwebhookリクエストの生の本文を検証できるようにすることです。
bodyParser.sizeLimit
は、bytesでサポートされている任意の形式で、解析された本文の最大サイズです:
externalResolver
は、このルートが_express_や_connect_などの外部リゾルバによって処理されていることをサーバーに明示的に伝えるフラグです。このオプションを有効にすると、未解決のリクエストに関する警告が無効になります。
responseLimit
は自動的に有効になり、APIルートのレスポンス本文が4MBを超える場合に警告します。
サーバーレス環境以外でNext.jsを使用しており、CDNや専用メディアホストを使用しない場合の性能への影響を理解している場合は、このリミットをfalse
に設定できます。
responseLimit
は、バイト数またはbytes
でサポートされている任意の文字列形式(1000
、'500kb'
、'3mb'
など)を取ることもできます。
この値は、警告が表示される前の最大レスポンスサイズになります。デフォルトは4MB。(上記参照)
レスポンスヘルパー
サーバーレスポンスオブジェクト(しばしばres
と省略される)には、開発者の体験を向上させ、新しいAPIエンドポイントの作成を高速化するExpress.js風のヘルパーメソッドのセットが含まれます。
含まれるヘルパーは以下の通りです:
res.status(code)
- ステータスコードを設定する関数。code
は有効なHTTPステータスコードである必要がありますres.json(body)
- JSONレスポンスを送信します。body
はシリアライズ可能なオブジェクトである必要がありますres.send(body)
- HTTPレスポンスを送信します。body
はstring
、object
、またはBuffer
にできますres.redirect([status,] path)
- 指定されたパスまたはURLにリダイレクトします。status
は有効なHTTPステータスコードである必要があります。指定されていない場合、status
はデフォルトで「307」「一時的リダイレクト」になります。res.revalidate(urlPath)
-getStaticProps
を使用してオンデマンドでページを再検証します。urlPath
はstring
である必要があります。
レスポンスのステータスコードの設定
クライアントに応答を返す際に、応答のステータスコードを設定できます。
次の例では、レスポンスのステータスコードを200
(OK
)に設定し、Hello from Next.js!
の値を持つmessage
プロパティをJSONレスポンスとして返します:
JSONレスポンスの送信
クライアントに応答を送信する際、JSONレスポンスを送信できます。これはシリアライズ可能なオブジェクトである必要があります。 実際のアプリケーションでは、リクエストされたエンドポイントの結果に応じて、クライアントにリクエストの状態を知らせたいことがあるでしょう。
次の例は、ステータスコード200
(OK
)と非同期操作の結果を含むJSONレスポンスを送信します。発生する可能性のあるエラーを処理するために、try-catchブロックに含まれており、適切なステータスコードとエラーメッセージがキャッチされ、クライアントに送り返されます:
HTTPレスポンスの送信
HTTPレスポンスの送信は、JSONレスポンスを送信する場合と同じ方法で動作します。唯一の違いは、レスポンスボディがstring
、object
、またはBuffer
になることができる点です。
次の例は、ステータスコード200
(OK
)と非同期操作の結果を含むHTTPレスポンスを送信します。
指定されたパスまたはURLへのリダイレクト
フォームを例に挙げると、フォームを送信した後にクライアントを特定のパスまたはURLにリダイレクトしたい場合があります。
次の例は、フォームが正常に送信された場合、クライアントを/
パスにリダイレクトします:
TypeScriptの型の追加
next
からNextApiRequest
とNextApiResponse
の型をインポートすることで、API Routesをより型安全にすることができます。さらに、レスポンスデータの型も指定できます:
補足:
NextApiRequest
の本文はany
になります。これは、クライアントが任意のペイロードを含む可能性があるためです。使用する前に、ボディの型/構造を実行時に検証する必要があります。
ダイナミックAPI Routes
API Routesはダイナミックルートをサポートしており、pages/
で使用されるファイル名付けルールに従います。
これで、/api/post/abc
へのリクエストは、テキストPost: abc
で応答します。
すべてをキャッチするAPI routes
三点リーダー(...
)をブラケット内に追加することで、API Routesですべてのパスをキャッチするように拡張できます。例えば:
pages/api/post/[...slug].js
は/api/post/a
にマッチし、/api/post/a/b
、/api/post/a/b/c
などにもマッチします。
補足:
slug
以外の名前を使用できます。例:[...param]
マッチしたパラメータはクエリパラメータ(例のslug
)としてページに送信され、常に配列になります。したがって、/api/post/a
のパスは次のクエリオブジェクトを持ちます:
/api/post/a/b
と他のマッチするパスの場合、新しいパラメータが配列に追加されます:
例:
これで、/api/post/a/b/c
へのリクエストは、テキストPost: a, b, c
で応答します。
オプションのすべてをキャッチするAPI routes
三点リーダーをダブルブラケット([[...slug]]
)に入れることで、キャッチオールルートをオプションにできます。
例えば、pages/api/post/[[...slug]].js
は/api/post
、/api/post/a
、/api/post/a/b
などにマッチします。
キャッチオールとオプションキャッチオールルートの主な違いは、オプションの場合、パラメータのないルート(上記の例では/api/post
)もマッチする点です。
クエリオブジェクトは次のようになります:
注意点
- 事前定義されたAPI routesは、ダイナミックAPI routesよりも優先され、ダイナミックAPI routesはキャッチオールAPI routesよりも優先されます。以下の例を参照してください:
pages/api/post/create.js
-/api/post/create
にマッチしますpages/api/post/[pid].js
-/api/post/1
、/api/post/abc
などにマッチしますが、/api/post/create
にはマッチしませんpages/api/post/[...slug].js
-/api/post/1/2
、/api/post/a/b/c
などにマッチしますが、/api/post/create
、/api/post/abc
にはマッチしません
Edge API Routes
Edge RuntimeでAPI Routesを使用したい場合は、App Routerに段階的に移行し、代わりにRoute Handlersを使用することをお勧めします。
Route Handlersの関数シグネチャは同型的であり、Edge と Node.js の両方のランタイムで同じ関数を使用できます。