Hola a todos, la idea de este post es conocer los tipos de retorno disponibles en ASPNET Web API y mostrar (según mi experiencia) cuál o cuales son los más adecuados.


Tal cuál está en la documentación oficial (mirala acá), Web API tiene 4 tipos de retorno que son (con una explicación más corta):

  • void: Código HTTP 204
  • Other type: Datos en el body y código HTTP 200
  • HttpResponseMessage: Mensaje HTTP
  • IHttpActionResult: Al final crea un HttpResponseMessage

Bien, ahora que se tiene claro los tipos de retorno, la pregunta es: Cuál debería usar? Personalmente recomiendo los dos últimos, pero primero veamos un ejemplo del porque los dos primeros (void y other type) no me gustan:

Partimos de un controllador UsersController que solo tiene un método el cual permite retornar un usuario filtrando por el id del mismo (la clase User solo tiene dos propiedas, Id y Name):


public class UsersController : ApiController
{
    private readonly List<User> _users = new List<User>()
    {
        new User(){ Id = 1, Name = "Iron Man"}
    }; 

    public User GetUser(int id)
    {
        return _users.FirstOrDefault(c => c.Id == id);
    }
}

Ahora, probemos el servicio consultando el usuario con id 1, y como se espera, es obtiene el usuario y el código de respuesta es 200 (hasta el momento todo bien):

Tipos de retorno

Bueno, pero ahora, que pasa si pasamos un id que no existe? Miremos la respuesta:

Tipos de retorno

WTF! El código HTTP de respuesta es 200 (que indica que todo va bien) pero no tenemos datos, el usuario no existe, por lo tanto, en este caso el resultado real del llamado y el código HTTP que obtenemos son inconsistentes.


Y por lo anterior (y algunas otras razones que luego iré comentando) es que esos tipos de retorno no me gustan, ahora, si reescribimos para usar HtppResponseMessage el controlador ahora queda:


public class UsersController : ApiController
{
    private readonly List<User> _users = new List<User>()
    {
        new User(){ Id = 1, Name = "Iron Man"}
    }; 

    public HttpResponseMessage GetUser(int id)
    {
        var user = _users.FirstOrDefault(c => c.Id == id);
        return user == null ? Request.CreateResponse(HttpStatusCode.NotFound) 
                            : Request.CreateResponse(HttpStatusCode.OK, user);
    }
}

Y ahora al validar con un Id que no existe efectivamente obtener el código 404 el cual indica que no se ha encontrado el recurso, así, desde el cliente que consume el servicio es posible manejar correctamente dicha respuesta e informar al usuario el resultado real del consumo del servicio.

Tipos de retorno

El resultado es el mismo, si utilizamos IHttpActionResult, en este caso el código quedaría:


public class UsersController : ApiController
{
    private readonly List<User> _users = new List<User>()
    {
        new User(){ Id = 1, Name = "Iron Man"}
    }; 

    public IHttpActionResult GetUser(int id)
    {
        var user = _users.FirstOrDefault(c => c.Id == id);
        if (user == null)
            return NotFound();
        return Ok(user);
    }
}

Bueno, espero lo anterior les ayude a ir creando cada vez mejor sus APIs! y si te gustó no te olvides compartirlo! Saludos