Dados da requisição
Agora a API precisa encontrar uma tarefa e filtrar a listagem. Em vez de analisar URLs manualmente, declare de onde vem cada argumento.
Parâmetros do caminho
import { Get, Param } from "empilha";
@Get("/:id")
find(@Param("id", Number) id: number) {
return { id, title: "Aprender Empilha" };
}Para GET /tasks/42, id recebe o número 42.
Sem o segundo argumento, valores de path são strings:
find(@Param("id") id: string) {}Number e Boolean fazem conversões simples. Schemas, vistos na próxima página, também podem validar parâmetros.
Query string
import { Query, t } from "empilha";
@Get("/")
list(
@Query("done", Boolean) done?: boolean,
@Query("page", Number) page = 1,
) {
return { filters: { done, page }, items: [] };
}Uma chamada a /tasks?done=true&page=2 entrega true e 2 ao método. Defaults do TypeScript continuam funcionando quando o parâmetro não existe.
Parâmetros repetidos são preservados como arrays:
/tasks?tag=backend&tag=typescriptCom @Request(), o valor será:
{ tag: ["backend", "typescript"] }Para validar e converter uma lista, declare um array no schema:
const Filters = t.Object({
tag: t.Array(t.String()),
});Headers
import { Header } from "empilha";
@Get("/")
list(@Header("x-tenant-id") tenantId: string) {
return { tenantId, items: [] };
}Nomes de headers são normalizados para minúsculas.
Quando precisar do conjunto inteiro
@Request() injeta a requisição normalizada:
import { Request, type RequestContext } from "empilha";
@Get("/debug")
debug(@Request() request: RequestContext) {
return {
method: request.method,
path: request.pathname,
query: request.query,
headers: request.headers,
};
}Prefira @Param, @Query e @Header quando a rota usa poucos valores. O contrato fica visível na assinatura.
Até aqui, tudo veio da URL
O próximo capítulo trata de JSON e schemas. Body exige validação porque é dado estruturado enviado pelo cliente.