ASP.NET Core -
Tipos de Retorno Action em Web
APIs
![]() |
Hoje vou apresentar os principais tipos de retornos de métodos Action usados em Apis da Web ou Web API com ASP .NET Core. (Reproduzido da documentação oficial) |
A ASP .NET Core oferece os seguintes tipos de retorno em métodos Action para Web APIs.
A seguir vamos discutir cada um deles e ver qual tipo é mais adequado dependendo do cenário.
1 - Tipo Específico
A Action mais simples pode retornar um tipo de dados primitivo ou complexo (string ou um objeto). Veja o exemplo a seguir que retorna uma coleção de objetos Produtos:
[HttpGet]
public IEnumerable<Produto> Get()
{
return _repository.GetProdutos();
}
|
Sem as
condições conhecidas para fazer a validação durante a execução da Action, um
tipo de retorno específico pode ser suficiente. A Action do exemplo não aceita
parâmetros, portanto, a validação de restrições de parâmetro não é necessária.
Quando condições conhecidas precisam ser consideradas em uma Action, vários
caminhos de retorno são introduzidos. Nesse caso, é comum misturar um tipo de
retorno ActionResult com o tipo de retorno
primitivo ou complexo. Tanto IActionResult quanto
ActionResult<T> são necessários para acomodar esse
tipo de Action.
2 - Tipo IActionResult
O tipo de retorno IActionResult é apropriado quando vários tipos de retorno ActionResult são possíveis em uma Action.
Os tipos ActionResult representam vários códigos de status HTTP. Alguns tipos de retorno comuns nessa categoria são BadRequestResult (400), NotFoundResult (404) e OkObjectResult (200).
Como existem vários tipos de retorno e caminhos na Action, o uso liberal do atributo [ProducesResponseType] é necessário. Esse atributo produz detalhes de resposta mais descritivos para páginas de ajuda da API geradas por ferramentas como o Swagger.
O Atributo [ProducesResponseType] indica os tipos conhecidos e códigos de status HTTP a serem retornados pela ação.
Veja o trecho de código onde temos um método Action síncrono onde existem dois tipos de retornos:
[HttpGet("{id}")]
[ProducesResponseType(typeof(Produto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetById(int id)
{
if (!_repository.TryGetProduto(id, out var produto))
{
return NotFound();
}
return Ok(produto);
}
|
No exemplo acima o código de status 404 é retornado quando o produto representado por id não existe na base de dados.
O método auxiliar NotFound é chamado como um atalho para retornar o novo NotFoundResult().
Se o produto existir, um objeto Produto representando a carga útil será retornado com um código de status 200. O método de ajuda Ok é chamado como a forma abreviada de retornar o novo OkObjectResult (produto).
Agora vejamos outro exemplo, desta vez um método Action Assíncrono onde são possíveis dois tipos de retorno:
[HttpPost]
[ProducesResponseType(typeof(Produto), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> CreateAsync([FromBody] Produto produto)
{
if (produto.Description.Contains("XYZ Demo"))
{
return BadRequest();
}
await _repository.AddProdutoAsync(produto);
return CreatedAtAction(nameof(GetById), new { id = produto.Id }, produto);
}
|
Neste código temos que :
Se o atributo [ApiController], introduzido no ASP.NET Core 2.1, for aplicado, os erros de validação do modelo resultarão em um código de status 400 automaticamente.
3 - ActionResult<T>
A partir da ASP.NET Core 2.1 temos o tipo de retorno ActionResult<T> para Actions das Web APIs que permite que você retorne um tipo derivado de ActionResult ou retorne um tipo específico.
O tipo de retorno ActionResult<T> oferece os seguintes benefícios sobre o tipo IActionResult:
[ProducesResponseType (200, Type = typeof (Produto))] é simplificado para [ProducesResponseType (200)].
O tipo de retorno esperado da ação é inferido do T em ActionResult<T>.
Como a linguagem C# não suporta operadores de conversão implícitos em interfaces, a conversão da interface para um tipo concreto é necessária para usar o ActionResult<T>. Por exemplo, o uso de IEnumerable no exemplo a seguir não funciona:
[HttpGet]
public ActionResult<IEnumerable<Produto>> Get()
{
return _repository.GetProdutos();
}
|
Uma opção para
corrigir o código anterior é retornar
_repository.GetProdutos().ToList().
Assim, a maioria das Actions tem um tipo de retorno específico. Condições
inesperadas podem ocorrer durante a execução da Action e, nesse caso, o tipo
específico não é retornado. Por exemplo, o parâmetro de entrada de uma Action
pode falhar na validação do modelo.
Nesse caso, é comum retornar o tipo ActionResult apropriado em vez do tipo específico.
E estamos conversados...
"Pensai nas coisas que são de cima, e não nas que são
da terra;"
Colossenses 3:2
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
ASP .NET Core 2 - MiniCurso Básico - Macoratti
ASP .NET Core - Macoratti
Conceitos - .NET Framework versus .NET Core - Macoratti
ASP .NET Core - Conceitos Básicos - Macoratti.net
ASP .NET Core MVC - CRUD básico com ADO .NET - Macoratti
ASP .NET Core - Implementando a segurança com ... - Macoratti.net
ASP .NET Core - Apresentando Razor Pages - Macoratti
Minicurso ASP .NET Core 2.0 - Autenticação com JWT - I - Macoratti
Minicurso ASP .NET Core 2.0 - Autenticação com JWT - II - Macoratti.net