Criando Action Results (IHttpActionResult) personalizados no ASP .NET WEB API

Neste artigo vou explicar como criar um Action Result, herdado da interface IHttpActionResult , no ASP .NET WEB API.

De modo geral, a interface IHttpActionResult representa a criação de repostas HTTP na nossa controller. Ela basicamente representa uma factory de respotas HTTP usando HttpResponseMessage.

Quem quiser mais detalhes, aqui no blog tem o post para entender a diferença entre os Action Results IHttpActionResult e HttpResponseMessage que explica o assunto.

No trecho de código abaixo temos dois exemplos de tipos de respostas IHttpActionResult que geralmente são usados em métodos de controllers.

[HttpGet]
public IHttpActionResult Get()
{
    if (_sampleData == null)
        return NotFound();

    return Ok();
}

O Ok() representa uma resposta HTTP que se refere a um status code de OK. Já a resposta NotFound(), representa uma resposta  HTTP que se refere a um status code de not found.

Para criar uma resposta personalizada, precisamos criar uma classe que implemente a interface IHttpActionResult e tenha um método chamado ExecuteAsync.

namespace System.Web.Http
{
    public interface IHttpActionResult
    {
        Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
    }
}

O método ExecuteAsync é chamado para criar um objeto  HttpResponseMessage, que representa uma reposta HTTP dentro da nossa aplicação. Nele é possível usar todas as funções desta classe e manipular a resposta a ser criada. O retorno do método é uma Task, que quando executada, vai conter o objeto de resposta HTTP.

Para entender melhor como tudo funciona, vamos criar uma resposta de exemplo.

namespace LuizPauloPradoBlog.WebApi.ActionResults
{
    public class SampleResult : IHttpActionResult
    {
        private string _message;

        public SampleResult()
        {
            _message = "OK " + DateTime.Now.ToShortDateString();
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(_message)
            };

            return Task.FromResult(response);
        }
    }
}

No exemplo acima foi criada uma resposta chamada SampleResponse que retorna sempre uma mensagem de OK com a data atual.

[HttpGet]
public IHttpActionResult Get()
{
    return new SampleResult();
}

Ao instanciar nosso SampleResult na controller, a classe irá internamente criar uma mensagem e executar o ExecuteAsync para criar a resposta HTTP.

O código completo do projeto está no GitHub, basta clicar aqui para vê-lo.

Se quiserem conhecer mais sobre mim, basta ir aqui no blog no menu quem sou e conferir também o meu LinkedIn.

Se ficou alguma dúvida, comenta aqui no blog que eu tento ajudar. 🙂

Deixe um comentário