ASP. NET MVC como Servicio REST

Cada vez más en nuestras aplicaciones web necesitamos simplificar nuestros desarrollos y adaptar nuestros recursos a las necesidades del momento. Actualmente la web demanda aplicaciones con interfaces ricas y servicios que retornen la mínima información posible para poder ser consumidas directamente desde el cliente con el mínimo esfuerzo posible.

La Aparición de los servicios REST a facilitado en mucho este tipo de demanda en detrimento de los servicios que utilizan SOAP y WSDL.

Porque no utilizar una aplicación ASP.NET MVC como un servicio REST en vez de los clásicos servicios de WCF si se adapta muchísimo mejor a los principios REST.

Principios REST

  1. Utilizar los métodos HTTP de forma Explícita
  2. Exponer Uris intuitivas
  3. Servicios sin estado “stateLess”
  4. Negociación de contenido

Crearé una aplicación MVC para consumir desde un cliente script utilizando JQuery y AJAX para ver que cumple con todas nuestras necesidades.

1. Métodos HTTP de forma Explícita “CRUD”

  • GET       –>  Consultas
  • POST    –>  Inserción
  • PUT      –>  Actualización
  • DELETE –> Eliminación

Que mejor que MVC para poder supervisar desde el controlador que petición es demandada dependiendo del método HTTP para realizar la acción correcta.

Como podéis comprobar podemos filtrar la acción dependiendo del tipo de petición de una manera tan simple como es simplemente decorando la acción con un atributo.

2 Uris intuitivas

Esto es otra característica distintiva de MVC sus rutas orientadas a SEO y fáciles de intuir y con su potentísimo enrutador.
[sourcecode language=»javascript»]
$.ajax({ url: "/Grupos", type: "GET", dataType: "Json" …
$.ajax({ url: "/Grupos", type: "POST", dataType: "Json"…
[/sourcecode]

Con la misma ruta obtendremos diferentes resultados dependiendo del tipo de petición HTTP, o si lo preferimos podemos personalizar la ruta para facilitar el aprendizaje de las rutas de los recursos.

HTTP GET –> http://TestMVCREST/Grupos

HTTP POST –> http://TestMVCREST/Add/Grupo

3 Servicio sin Estado

Como el propio protocolo HTTP cada llamada será independiente y no se mantendrá el estado dejando esa responsabilidad al cliente que realiza las llamadas.

4 Negociación de Contenido

Por último, es bueno construir los servicios de manera que usen el atributo HTTP Accept del encabezado, en donde el valor de este campo es el tipo MIME. De esta manera los clientes pueden elegir que formato de datos quieren leer y minimiza el acoplamiento de datos entre el servicio y las aplicaciones que lo consumen.

Algunos de los tipos MIME más usados para los servicios web REST son:

MIME-Type Content-Type
JSON application/json
XML application/xml
XHTML application/xhtml+xml

Esto permite que el servicio sea utilizado por distintos clientes escritos en diferentes lenguajes, corriendo en diversas plataformas y dispositivos.  Para eso he creado un cliente que consumirá el servicio MVC REST desde una página HTML con Jquery y llamadas AJAX.

HTTP GET

Para recuperar los datos de los grupos de usuarios:

Utilizamos la misma llamada AJAX para recuperar los datos, pero especificando en que formato los queremos Json o XML en el parámetro contentType”.

Cliente AJAX:

[sourcecode language=»javascript»]
function GetGruposJSon() {
$.ajax({ url: "/Grupos", type: "GET", dataType:"Json",
contentType: "application/json",
success: GetGruposOk, error: GetGruposKO
});
}

function GetGruposXML() {
$.ajax({ url: "/Grupos", type: "GET",
contentType: "application/xml", dataType: "xml",
success: GetGruposOk, error: GetGruposKO
});
}
[/sourcecode]

Servicio REST que devuelve la lista de grupos.

No me entretendré en explicar como devolver el formato dependiendo del contentType, porque Eduard Tomas ya lo explicó perfectamente es esta entrada ASP.NET MVC – Formato de salida según Content-Type

Los datos en el cliente en formato JSon:

Los datos en el cliente en formato XML:

HTTP POST

Para insertar un nuevo grupo a la lista:

[sourcecode language=»javascript»]
function AddGrupo() {
var nuevoGrupo = { nombre: "LoNetCamp", origen: "Tarragona",
imagen: "" };

$.ajax({ url: "/Grupos", type: "POST", dataType: "Json",
processData: true,
success: AddGrupoOk, error: AddGrupoKo, data: nuevoGrupo
});
}
[/sourcecode]

Añadimos los datos como un objeto para que se envíen en el formulario como datos y no en el QueryString, la petición es en la misma ruta pero diferente tipo de petición.

Desde nuestro cliente HTML obtendremos acceso a los recursos del servicio MVC REST sin problemas.

Esta práctica es muy útil para consumir los servicios desde clientes web de una forma ligera y con llamadas AJAX, pero hay que tener en cuenta sus limitaciones de seguridad y no es una solución que podamos utilizar para todos nuestros escenarios.

2 comentarios en “ASP. NET MVC como Servicio REST”

  1. Hola… tengo un pequeño dilema con MVC como servicio REST… espero puedas colaborarme.
    Resulta que cuando depuro el proyecto con el visual con el servidor integrado funciona la llamada por ajax a la acción del controlador lo cual hago de la siguiente forma
    $.ajax({
    url: ‘/Home/Registro’, ….
    });

    pero cuando paso el proyecto al IIS que tengo en mi equipo.. ya no funciona la llamada al servicio como lo describi arriba si no que tengo que anteponerle el nombre de la carpeta raiz
    $.ajax({
    url: ‘/MvcApp/Home/Registro’, ….
    });
    y de esta forma si funciona.

    lo curioso es que si intento dejar la url asi ‘/MvcApp/Home/Registro’ y depuro desde el visual ya no funciona la llamada.

    Cual seria la mejor forma de referirse a la URL para hacer la llamada ajax de la action

    Gracias por la colaboración!

    1. El problema que tienes es que cuando lo utilizas depurando estas utilizando seguramente el servidor de desarrollo o el IIS expres. De esta forma estas utilizando directamente el localhost con un puerto específico, cuando publicas tu aplicación en el IIS lo estas haciendo en un web site llamado MvcApp. Esto hace que la ruta sea diferente, en realidad no estas haciendo nada mal, lo único que tienes que hacer es adaptar tu llamada AJAX a la ruta real del servicio. Si prefieres cuando desarrolles le puedes especificar una rata personalizada para que se parezca a la que será la buena, para que luego no tengas que cambiar nada.

      Saludos

Deja un comentario

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