Astroでは、どんな種類のデータでも提供できるカスタムエンドポイントを作成できます。これを利用して、画像を生成したり、RSSを公開したり、またはAPIルーティングとして使用してサイトの完全なAPIを構築したりできます。
静的に生成されたサイトでは、カスタムエンドポイントは静的ファイルを生成するため、ビルド時に呼び出されます。SSRモードを選択した場合、カスタムエンドポイントはリクエストに応じて呼び出される動的なサーバーエンドポイントに変わります。静的エンドポイントとSSRエンドポイントは同じ様に定義されますが、SSRエンドポイントは追加機能をサポートします。
静的ファイルのエンドポイント
カスタムエンドポイントを作成するには、.js
または.ts
ファイルを/pages
ディレクトリに追加してください。.js
または.ts
の拡張子はビルドプロセス中に削除されるので、ファイル名には作成したいデータの拡張子を含める必要があります。たとえば、src/pages/data.json.ts
は、ビルドすると/data.json
エンドポイントとなります。
エンドポイントは、Astro
グローバルと同様のプロパティを持つコンテキストオブジェクト (EN)を受け取るGET
関数(async
も可)をエクスポートします。以下のエンドポイントはname
とurl
を持つレスポンスオブジェクトを返しており、Astroはビルド時にこれを呼び出し、bodyの内容を使ってファイルを生成します。
Astro v3.0以降、返り値のResponse
オブジェクトがencoding
プロパティを含む必要はなくなりました。たとえば、バイナリのpng画像を生成する場合は次のようになります。
また、APIRoute
型を使用してエンドポイント関数に型付けもできます。
params
と動的ルーティング
エンドポイントは、ページと同じ動的ルーティング機能をサポートしています。ファイル名を角括弧付きのパラメーター名とし、getStaticPaths()
関数 (EN)をエクスポートしてください。そして、エンドポイント関数に渡されたparams
プロパティを使用して、パラメーターにアクセスします。
これにより、ビルド時に/api/0.json
、/api/1.json
、/api/2.json
、/api/3.json
という4つのJSONエンドポイントが生成されます。エンドポイントによる動的ルーティングはページと同じように動作しますが、エンドポイントはコンポーネントではなく関数であるため、props (EN)はサポートされていません。
request
すべてのエンドポイントはrequest
プロパティを受け取りますが、静的モードではrequest.url
にのみアクセスが可能です。これは、現在のエンドポイントの完全なURLを返し、Astro.request.url (EN)がページに対して行うのと同じように動作します。
サーバーエンドポイント(APIルーティング)
静的ファイルエンドポイントのセクションで説明したものはすべて、SSRモードでも使用できます。ファイルは、Astro
グローバルと同様のプロパティを持つコンテキストオブジェクト (EN)を受け取るGET
関数をエクスポートできます。
しかし、static
モードとは異なり、server
モードを設定すると、エンドポイントはリクエストされた時点でビルドされます。これにより、ビルド時には利用できない新しい機能が利用可能となり、リクエストをリッスンするAPIルートを構築したり、実行時にサーバー上で安全にコードを実行できるようになります。
サーバーエンドポイントは、getStaticPaths
のエクスポートなしでparams
にアクセスできます。また、Response
オブジェクトを返せるので、ステータスコードやヘッダーを設定できます。
これは、動的ルーティングにマッチするすべてのリクエストに応答します。たとえば、/helmet.json
に移動した場合、params.id
はhelmet
に設定されます。モックの商品データベースにhelmet
が存在すれば、エンドポイントはResponse
オブジェクトを作成してJSONで応答し、成功を意味するHTTPステータスコードを返します。存在しない場合は、Response
オブジェクトを使用して404
で応答します。
特定のプロバイダーは、SSRモードで画像を返すためにContent-Type
ヘッダーを要求します。この場合、Response
オブジェクトを使用してheaders
プロパティを指定します。以下はバイナリの.png
画像を返却する例です。
HTTPメソッド
GET
関数に加えて、任意のHTTPメソッドの名前をもつ関数をエクスポートできます。リクエストが来た時、Astroはメソッドをチェックし、対応する関数を呼び出します。
対応するエクスポートされた関数がないHTTPメソッドにマッチするALL
関数をエクスポートすることもできます。対応するメソッドがないリクエストが来た場合、サイトの404ページにリダイレクトされます。
関連レシピ
request
SSRモードでは、request
プロパティは、現在のリクエストを参照する完全に使用可能なRequest
オブジェクトを返します。これにより、データの取得やヘッダーのチェックができます。
リダイレクト
エンドポイントのコンテキストは、Astro.redirect
に似たredirect()
ユーティリティをエクスポートします。
Learn