Перейти к содержимому

Эндпойнты

Astro позволяет создавать пользовательские эндпойнты (точки входа) для обслуживания любого типа данных. Вы можете использовать их для генерации изображений, предоставления RSS-документов или в качестве API-маршрутов для создания полноценного бэкенда вашего сайта.

На статических сайтах эндпойнты вызываются во время сборки для создания файлов. В режиме рендеринга по запросу (SSR) они превращаются в живые серверные маршруты.

Чтобы создать эндпойнт, добавьте файл .js или .ts в папку src/pages/. Расширение скрипта будет удалено, поэтому имя файла должно включать желаемое расширение данных. Например, src/pages/data.json.ts создаст эндпойнт /data.json.

Эндпойнты экспортируют функцию GET, которая возвращает объект Response.

src/pages/builtwith.json.ts
// Результат: /builtwith.json
export async function GET() {
return new Response(
JSON.stringify({
name: "Astro",
url: "https://astro.build/",
}),
);
}

Вы также можете отдавать бинарные данные, например изображения:

src/pages/logo.png.ts
export async function GET() {
const response = await fetch("https://docs.astro.build/assets/full-logo-light.png");
return new Response(await response.arrayBuffer());
}

В режиме SSR эндпойнты вызываются при каждом запросе. Это позволяет создавать API, которые работают с заголовками, куками и защищенно выполняют код на сервере.

Если ваш проект по умолчанию статический, вы можете включить серверный режим для конкретного эндпойнта:

src/pages/api/user.ts
export const prerender = false;
export async function GET({ params, request }) {
return new Response(JSON.stringify({ message: "Это серверный ответ" }));
}

Вы можете экспортировать функции для различных методов: POST, PUT, DELETE, PATCH. Функция ALL будет обрабатывать любые методы, для которых нет отдельного экспорта.

src/pages/api/data.ts
import type { APIRoute } from 'astro';
export const POST: APIRoute = async ({ request }) => {
const body = await request.json();
return new Response(JSON.stringify({ received: body.name }), { status: 200 });
}

В контексте эндпойнта доступна утилита redirect(), работающая аналогично Astro.redirect:

export async function GET({ redirect }) {
return redirect('/new-location', 307);
}