Capítulo 347 de 456
Qualquer arquivo em pages/api vira um endpoint server-side (/api/*) no Pages Router, sem aumentar o bundle client-side. Equivalente ao Route Handler do App Router.
pages/api/*.ts: handler (req, res) => {} mapeado para /api/*; roda só no servidor.NextApiRequest / NextApiResponse: tipos TypeScript para request/response, com helpers estilo Express.req.cookies / req.query / req.body: request helpers built-in, com parsing automático por content-type.config.api.bodyParser: desliga (false) ou limita (sizeLimit) o parsing automático do body (ex. para validar webhooks assinados).config.api.externalResolver: sinaliza que a rota é tratada por um resolver externo (express/connect), suprime warnings.config.api.responseLimit: limite de aviso do tamanho de resposta (default 4MB); pode virar false ou número/string de bytes.config.maxDuration: duração máxima (segundos) permitida para a function executar.[pid].ts, [...slug].ts, [[...slug]].ts seguem as mesmas regras de pages/.res.status(), res.json(), res.send(), res.redirect(), res.revalidate(urlPath).import type { NextApiRequest, NextApiResponse } from 'next'
type ResponseData = { message: string }
export default function handler(
req: NextApiRequest,
res: NextApiResponse<ResponseData>
) {
res.status(200).json({ message: 'Hello from Next.js!' })
}
export const config = {
api: {
bodyParser: false,
},
}
export default function handler(req: NextApiRequest, res: NextApiResponse) {
const { slug } = req.query
res.end(`Post: ${slug.join(', ')}`)
}
slug sempre como array na query.| Config | Default | Uso |
|---|---|---|
bodyParser | true | false para consumir body como Stream/raw-body |
bodyParser.sizeLimit | '1mb' | limite do body parseado |
externalResolver | false | true quando express/connect resolve a rota |
responseLimit | '4mb' (aviso) | false desliga o aviso; aceita bytes ou string ('8mb') |
maxDuration | - | segundos máximos de execução |
| Padrão de rota | Exemplo de match |
|---|---|
pages/api/post/create.js | /api/post/create (precedência máxima) |
pages/api/post/[pid].js | /api/post/1, /api/post/abc |
pages/api/post/[...slug].js | /api/post/a/b/c |
pages/api/post/[[...slug]].js | /api/post, /api/post/a, ... (opcional) |
pages/api é server-only: nunca infla o bundle do cliente.bodyParser: false é o caminho para verificar assinaturas de webhook no raw body.[...slug]) sempre entrega array; optional catch-all ([[...slug]]) também casa a rota sem parâmetro.res.writeHead/res.write, mas a doc recomenda Route Handlers do App Router no Next.js 14+.lib/.