[ASP.NET Web API 2] IHttpActionResult: Una factoría de respuestas para dominarlos a todos

En la primera versión de ASP.NET Web API cada vez que en una acción de un controlador queríamos crear una respuesta al usuario (Imaginaros un POST) y queríamos devolver algo más que el recurso  creado, por ejmplo el status code Created 201 y la url del mismo en la cabecera Location, teníamos que crearnos un HttpResponseMessage a mano y muchas veces caíamos en el error de tener código duplicado en nuestros controladores, algo como esto:

var response = Request.CreateResponse(HttpStatusCode.Created, user);

 

response.Headers.Location = 

    Url.Link("DefaultApi", new {controller = "Users", id = id});

 

return response;

 

Una de las novedades que me gusta mucho de ASP.NET Web API 2 es la llegada de IHttpActionResult, que básicamente es una interfaz que al implementarla dará como resultado una clase que actuará como una factoría de HttpResponseMessage y que podremos reutilizar en todas las acciones de los controladores que queramos. Así pues un ejemplo de uso sería el mencionado ejemplo que pusimos al principio de crear recursos vía POST:

public class CreatedActionResult : IHttpActionResult

{

    private readonly HttpRequestMessage _request;

    private readonly string _location;

 

    public CreatedActionResult(HttpRequestMessage request, string location)

    {

        _request = request;

        _location = location;

    }

 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)

    {

        var response = _request.CreateResponse(HttpStatusCode.Created); 

        response.Headers.Location = new Uri(_location);

        return Task.FromResult(response);

    }

}

Ahora tenemos el código centralizado en la clase CreatedActionResult y el pipeline de WebAPI llamará al método ExecuteAsync para crear la respuesta y podemos reutilizarlo en nuestros controladores:

public CreatedActionResult Post(string id, PostUserRequestModel requestModel)

{

    //Add user

 

    return new CreatedActionResult(Request, Url.Link("DefaultApi", new {controller = "Users", id = id}));

}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *