Capítulo 26 de 456
Next.js pode servir como camada de API pública (não substituto de backend completo) via Route Handlers e proxy, retornando qualquer tipo de conteúdo, fazendo content negotiation, proxy para outro backend, e recebendo webhooks/callbacks.
route.ts/route.js que trata requisições HTTP públicas por método (GET, POST, etc.), retorna qualquer content-type.has: [{ type: 'header', key: 'accept', value: '...' }] em next.config.js para servir Markdown a agentes de IA e HTML a browsers na mesma URL.request.clone(): necessário porque o body de um Request só pode ser lido uma vez; ler de novo sem clone lança erro.NextRequest/NextResponse: extensões das Web APIs Request/Response; NextRequest.nextUrl expõe pathname/searchParams parseados; NextResponse tem helpers next(), json(), redirect(), rewrite(). Compatíveis com as APIs padrão (aceitam/retornam uma pela outra).proxy (antes chamado middleware): único arquivo por projeto, roda antes da rota, usa config.matcher para escopo; pode autenticar, reescrever (NextResponse.rewrite) ou redirecionar (NextResponse.redirect).createHandler/createMiddleware para gerar o handler/proxy compartilhado.// next.config.js — content negotiation por Accept header
module.exports = {
async rewrites() {
return [{
source: '/docs/:slug*',
destination: '/docs/md/:slug*',
has: [{ type: 'header', key: 'accept', value: '(.*)text/markdown(.*)' }],
}]
},
}
Vary: Accept na resposta pra não poluir cache compartilhado.// app/api/[...slug]/route.ts — proxy validado para backend externo
export async function POST(request: Request, { params }) {
const clonedRequest = request.clone()
const isValid = await isValidRequest(clonedRequest)
if (!isValid) return new Response(null, { status: 400 })
const { slug } = await params
const proxyURL = new URL(slug.join('/'), 'https://nextjs.org')
return fetch(new Request(proxyURL, request))
}
// proxy.ts — bloqueio de rota não autenticada
export const config = { matcher: '/api/:function*' }
export function proxy(request: Request) {
if (!isAuthenticated(request)) {
return Response.json({ success: false }, { status: 401 })
}
}
proxy intercepta antes da rota ser alcançada, ideal para auth centralizada.| Caso de uso | Ferramenta |
|---|---|
| Endpoint público HTTP qualquer content-type | Route Handler |
| Interceptar/reescrever/redirecionar antes da rota | proxy |
| Negociação simples por header | rewrites + has |
| Negociação avançada | proxy |
GET: URL pode ser logada/cacheada; usar POST.proxy para autenticação/autorização: sempre revalidar credenciais no Route Handler também.NextResponse.next({request:{headers}})) vs response headers.sitemap.xml, robots.txt) e customizadas.Accept header + rewrites/proxy permite servir Markdown pra LLMs e HTML pra humanos na mesma URL.proxy é o único ponto de interceptação global por projeto (matcher configurável); libs terceiras às vezes ainda chamam de "middleware".export mode, só GET funciona, com dynamic = 'force-static'.