Results API no .NET (Classe Results) | API | CSharp
- Results API no .NET (Classe Results) | API | CSharp
Definição
A classe Results no .NET é utilizada em Minimal APIs para retornar respostas HTTP de forma simples, explícita e sem a necessidade de controllers.
Ela pertence ao namespace:
Microsoft.AspNetCore.Http
E fornece métodos estáticos para gerar respostas HTTP padronizadas.
Objetivo
A Results resolve principalmente:
- padronização de respostas HTTP
- redução de boilerplate
- clareza no retorno da API
- melhor controle de status codes
Exemplo básico
var app = WebApplication.CreateBuilder(args).Build();
app.MapGet("/hello", () =>
{
return Results.Ok("Hello World");
});
app.Run();
Principais métodos
Sucesso
Results.Ok(object value);
Results.Created(string uri, object value);
Results.NoContent();
Erro do cliente
Results.BadRequest(object error);
Results.Unauthorized();
Results.Forbid();
Results.NotFound();
Results.Conflict(object error);
Redirecionamento
Results.Redirect(string url);
Mapeamento para HTTP
| Método | Status Code |
|---|---|
| Ok | 200 |
| Created | 201 |
| NoContent | 204 |
| BadRequest | 400 |
| Unauthorized | 401 |
| Forbidden | 403 |
| NotFound | 404 |
| Conflict | 409 |
Uso com validação
app.MapPost("/users", (User user) =>
{
if (string.IsNullOrEmpty(user.Name))
return Results.BadRequest("Name is required");
return Results.Ok(user);
});
Uso com tipagem forte (IResult)
A maioria dos métodos retorna IResult.
IResult GetUser(int id)
{
if (id <= 0)
return Results.BadRequest();
return Results.Ok(new { Id = id });
}
Uso com TypedResults (recomendado em cenários mais robustos)
TypedResults adiciona tipagem mais forte e melhor suporte para OpenAPI.
app.MapGet("/users/{id}", (int id) =>
{
if (id <= 0)
return TypedResults.BadRequest();
return TypedResults.Ok(new { Id = id });
});
Integração com backpressure
A Results pode ser usada para aplicar controle de entrada (backpressure na borda).
Exemplo com limitação simples
int currentRequests = 0;
int maxRequests = 5;
app.MapPost("/process", async (HttpRequest request) =>
{
if (currentRequests >= maxRequests)
return Results.StatusCode(429); // Too Many Requests
currentRequests++;
try
{
await Task.Delay(2000); // simula processamento
return Results.Ok("Processed");
}
finally
{
currentRequests--;
}
});
Integração com Channel (controle de fluxo interno)
Combinação comum:
Results→ resposta HTTPChannel→ controle interno (backpressure)
var channel = Channel.CreateBounded<string>(5);
app.MapPost("/enqueue", async (HttpRequest request) =>
{
using var reader = new StreamReader(request.Body);
var content = await reader.ReadToEndAsync();
if (!await channel.Writer.WaitToWriteAsync())
return Results.StatusCode(503); // sistema sobrecarregado
await channel.Writer.WriteAsync(content);
return Results.Accepted();
});
Boas práticas
- usar
Resultspara APIs simples e diretas - usar
TypedResultsquando precisar de documentação (Swagger/OpenAPI) - padronizar respostas (evitar misturar objetos arbitrários)
- usar status codes corretos
- integrar com mecanismos de controle de carga
Quando usar Results vs Controller
Results (Minimal API)
- APIs leves
- serviços simples
- alta performance
Controllers
- APIs complexas
- necessidade de filtros, middleware avançado
- organização por domínio
Observações importantes
Resultsnão possui estado- métodos são estáticos
- funciona diretamente no pipeline HTTP
- reduz abstração comparado ao MVC