Buscar (Don't Edit)

lunes, 19 de mayo de 2014

Creando una API REST con ASP.NET Web Api

El internet es un mundo muy grande, cambiante y revolucionario, pero todo gracias a las personas que hacen uso de él y de quienes ayudan a mejorarlo a través de las tecnologías y el software. En éste último tema es en donde nos enfocaremos, en el que día con día se construyen mejores sistemas y servicios basados en SOA, y una de las cosas que lo ha permitido son las API's, tanto SOAP como REST (aunque las primeras han ido perdiendo terreno), siendo éstas últimas las de más auge recientemente. En este tutorial veremos como crear una API REST en .NET usando Web Api y EntityFramework.
Lo que debes saber antes:


Lo que haremos
Desarrollaremos una API con los métodos CRUD usuales (get, post, put, delete) para una aplicación de colecciones de carritos. Para ello utilizaremos las siguientes herramientas: 
  • Herramientas
    • Visual Studio 2013, MS Sql Server 2008, Fiddler Web Debugger.
  • Frameworks
    • ASP.NET Web Api, Entity Framework.
  • Programación
    • C#, Linq
¡Let's start!
Modelo en BD
Lo primero que haremos será crear una pequeña base de datos (yo la llamaré HWdatabase) de la siguiente manera:

CREATE TABLE Users( 
UserId INT PRIMARY KEY IDENTITY, UserName NVARCHAR(100), UserLogin NVARCHAR(50), UserPassword NVARCHAR(20), Activo BIT)

CREATE TABLE Cars( 
CarId INT PRIMARY KEY IDENTITY, CarName NVARCHAR(50), Tags TEXT, Activo BIT)

CREATE TABLE CarCollection( 
CarCollectionId INT PRIMARY KEY IDENTITY, CarId INT FOREIGN KEY REFERENCES Cars(CarId), UserId INT FOREIGN KEY REFERENCES Users(UserId), Activo BIT)

Los datos que he ingresado a la BD son los siguientes:

Creando un proyecto Web Api
Ahora que ya tenemos nuestros datos abramos nuestro Visual Studio. Creamos un nuevo proyecto de ASP.NET MCV 4 y denle el nombre que quieran, yo lo llamaré HWwebApi.

En la siguiente pantalla seleccionamos Web Api, y clickamos en OK.

Creando el modelo con Entity Framework
A continuación utilizaremos las tablas de la base de datos para crear nuestro modelo. Haciendo click derecho sobre nuestro proyecto->Add->New Item y en la sección Data seleccionamos ADO.NET Entity Data Model, le damos un nombre y continuamos.
En la siguiente pantalla seleccionamos "Generate from database", y luego Next.
A continuación clickamos sobre New Connection para añadir la conexión con nuestra base de datos.
Introducimos los datos de nuestro servidor y el nombre de la base de datos. Seleccionamos OK.
Ahora solo le damos un nombre a nuestra conexión (en mi caso HWEntities) y click en Next
Por último, seleccionamos todas las tablas de nuestra base de datos, y también la opción que dice "Pluralize or singularize generated object names", esto es para que cree nuestras entidades de manera singularizada, esto si sus tablas las crearon con nombres pluralizados, es opcional. Damos click en Finish.

Creando el API Controller
Ya que tenemos el modelo, vayamos a crear el controlador con los métodos necesarios. Sobre la carpeta Controllers de nuestro proyecto damos click derecho->Add->Controller.
En la pantalla que aparece le damos un nombre a nuestro controlador (elijan un nombre y denle la terminación Controller), en Template asegurense de escoger el API Controller que usa Entity Framework, en Model class seleccionamos nuestra entidad CarCollection y en DataContext nuestra cadena de conexión (en mi caso era HWEntities). Deben tener algo como lo que se ve en la imagen. Una vez que tengan todo listo, dan click en Add.

Como pueden ver les genera una clase controlador con los métodos de la API utilizando el modelo que creamos anteriormente con Entity Framework.

Probando la AP... Pero antes una sola cosita
Recordemos que estamos construyendo una API REST con EF y que devuelve datos en JSON, y recordemos que JSON no soporta referencias circulares (aquello de que una colección referencia a un carro, y el carro a su vez referencia a la colección a la que pertenece y ésta a su vez... entienden?), pueden encontrar mucha información en internet sobre este problema y muy buenas soluciones. Lo que haremos nosotros será especificar los datos que queremos devolver y, de ésta manera, evitar las referencias circulares que pudiesen haber.

Evitando referencias circulares
Sooooooo, let's go Linq!!! Cambiaremos un poco los métodos GET, ya que los problemas de referencia circular se dan en las consultas.
El primer método GET nos queda de la siguiente manera:

Y el segundo así

Con esto devolvemos datos específicos y evitamos el problema de las referencias circulares. Otra manera de resolverlo sería usando un ViewModel, aunque el método sigue siendo el mismo.

Ahora sí... Probando la API
Ahora pasaremos a probar nuestra API, para esto primero necesitamos descargarnos el Fiddler Web Debugger e instalarlo.
Lo siguiente será correr nuestra aplicación, una vez que la tengamos corriendo en nuestro navegador, copiamos la URL que nos da IIS, en mi caso es localhost:8614, y nos dirigimos a nuestro Fiddler y en la pestaña Composer pegamos la URL que recién copiamos.

Ahora, en la misma pestaña, probemos alguno de los métodos de nuestra API. Probemos primero los métodos GET, seleccionando este verbo de la lista de verbos seleccionables y colocando lo siguiente en la casilla de la URL:


Ahora presionamos Execute y Fiddler hará una llamada a nuestra aplicación, concretamente al método GetCarCollections. Del lado izquierdo de la ventana podemos observar las respuestas a nuestras llamadas, si fueron exitosas o no.Ahora si nos movemos a la casilla Inspector y en una de las ventanas de abajo, donde dice JSON podemos observar los datos devueltos por la llamada a nuestra API.


Ahora haremos una llamada a una colección por id, por lo que el método que usaremos será el de GetCarCollection. La llamada queda de la siguiente manera:


Y la respuesta

Ahora probemos a insertar una nueva colección, cambiaremos el verbo a POST y la URL de la siguiente manera:


Además en la parte de abajo de la ventana Composer, se activará la casilla de Request Body, aquí es donde debemos colocar el objeto JSON a insertar. Enviemos un objeto sencillo y la pantalla nos debe quedar como se ve en la imagen: 

NOTA: No olviden colocar en los headers "Content-type: application/json" para indicar que estamos enviando un objeto de este tipo.
A continuación presionamos Execute y se ejecutará la llamada devolviendo lo siguiente:

Y en la base de datos, en nuestra tabla de colecciones:
Los métodos PUT y DELETE funcionan de manera similar.

Y de ésta manera tan sencilla, ya tenemos creada una simple API REST con ASP.NET. Espero les sea de utilidad.

Saludos ;)

No hay comentarios.:

Publicar un comentario