Skip to main content

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étodoStatus Code
Ok200
Created201
NoContent204
BadRequest400
Unauthorized401
Forbidden403
NotFound404
Conflict409

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 HTTP
  • Channel → 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 Results para APIs simples e diretas
  • usar TypedResults quando 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

  • Results não possui estado
  • métodos são estáticos
  • funciona diretamente no pipeline HTTP
  • reduz abstração comparado ao MVC