[REST WCF] Haciendo nuestros servicios RESTful – 201 (Created)

Cuando un servicio se diseña basandose en los principios de REST se denominan RESTful y uno de estos principios es que cuando se crea un recurso el servicio debe responder con un código 201 (Created) además de retornar la Url del recurso creado.

Si creamos un servicio REST con WCF y creamos un recurso, esta es la respuesta por defecto que nos dá el servicio:

rest201

rest201_2

 

Como podéis observar, el servicio nos retorna un código 200 (OK) y no es que este mal, pero siguiendo el estilo o los principios de REST debe comportase como se citó anteriormente.

Para modificar las cabeceras HTTP, disponemos una clase WebOperationContext, que es una wrapper con el que vamos a poder modificar las cabeceras HTTP:

Bb515723.pubproperty(es-es,VS.90).gifBb515723.static(es-es,VS.90).gif
Current
Obtiene el contexto de operación web actual.

Usar en Cliente:

Bb515723.pubproperty(es-es,VS.90).gif
IncomingResponse
Obtiene el contexto de respuesta web para la solicitud que se está recibiendo.

Bb515723.pubproperty(es-es,VS.90).gif
OutgoingRequest
Obtiene el contexto de solicitud web para la solicitud que se está enviando.

Usar en Servidor:

Bb515723.pubproperty(es-es,VS.90).gif
IncomingRequest
Obtiene el contexto de solicitud web para la solicitud que se está recibiendo

Bb515723.pubproperty(es-es,VS.90).gif
OutgoingResponse
Obtiene el contexto de respuesta web para la respuesta que se está enviando.

 

En nuestro caso vamos a utilizar Current, para acceder al contexto y OutgoingResponse, para obtener el contexto de respuesta y modificar la cabecera HTTP:

/// <summary>
/// Adds the product.
/// </summary>
/// <param name="product">The product.</param>
/// <returns></returns>
public Product AddProduct(Product product)
{
    product.Id = Guid.NewGuid().ToString();
    product.LastModified = DateTime.Now;
    _products.Add(product);
 
    UriTemplate ut = new UriTemplate("/products/{id}");
    Uri baseUri = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri;
    Uri ret = ut.BindByPosition(baseUri, product.Id);
 
    OutgoingWebResponseContext owrc = WebOperationContext.Current.OutgoingResponse;
    owrc.SetStatusAsCreated(ret);
 
    return product;
}

 

Con este código conseguimos nuestro proposito, retornar el 201 (Created) y la Url del recurso creado:

rest201_3

 

Esto es todo!!!

Published 23/4/2009 19:34 por Luis Ruiz Pavón
Archivado en: ,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2009/04/23/rest-wcf-haciendo-nuestros-servicios-restful-201-created.aspx