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) {}Body HTTP
@Body() lê JSON, texto, application/x-www-form-urlencoded e multipart/form-data. Texto é entregue como string; formulários são objetos e campos repetidos viram arrays. Em multipart, arquivos são valores File. O runtime aplica os limites de bytes e timeout definidos na configuração HTTP.
@Post("/")
create(@Body() body: { title: string }) {
return { title: body.title };
}Number e Boolean fazem conversões simples. Schemas, vistos na próxima página, também podem validar parâmetros.
Query string
import { Query, QueryParams, 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.
Quando a rota tem muitos filtros, você pode validar a query inteira com @QueryParams:
const Filters = t.Object({
page: t.Integer({ minimum: 1 }),
done: t.Optional(t.Boolean()),
});
@Get("/")
@QueryParams(Filters, { page: 1 })
list() {}Deixe schemas e validações detalhadas para o próximo capítulo. Aqui, a regra simples é: poucos valores usam @Query; muitos filtros usam @QueryParams.
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.
Valide dados externos
O próximo capítulo adiciona schemas ao body e à query. Use um schema sempre que o formato recebido fizer parte do contrato da rota.