[ASP.NET Web API] Web API II – Creando un CRUD, trabajando con verbos Http

Posted on Actualizado enn


Hola a todos, en el post pasado vimos una pequeña introducción a ASP.NET Web API y creamos nuestro primer proyecto (míralo acá), hoy vamos a revisar como podemos implementar fácilmente un CRUD (create, read, update y delete) , así que a darle entonces.

Lo primero que necesitamos es una clase (modelo) sobre la cual implementar el CRUD, la clase es sencilla pero de utilidad para el ejemplo:

public class Person
{
	public int Id { get; set; }
	public string Name { get; set; }
	public string LastName { get; set; }
	public string Twitter { get; set; }
}

Ahora, crearemos la clase que será el contexto de nuestra base de datos (si, usaremos Entity Framework):

public class PersonDBContext : DbContext
{
	public DbSet Person { get; set; }

	protected override void OnModelCreating(DbModelBuilder modelBuilder)
	{
		base.OnModelCreating(modelBuilder);
	}
}

Ya que tenemos el contexto y nuestro modelo, es momento de definir como se inicializara nuestra base de datos, así entonces en la carpeta App_Start adicionamos una nueva clase llamada PersonDBInitializer:

public class PersonDBInitializer : DropCreateDatabaseAlways
{
	protected override void Seed(PersonDBContext context)
	{
		var persons = new List {
			new Person { Name = "Julio", LastName = "Avellaneda", Twitter = "@julitogtu"},
			new Person { Name = "Juan", LastName = "Ruiz", Twitter = "@juankruiz"},
			new Person { Name = "Roberto", LastName = "Alvarado", Twitter = "@ralvaradot"},
			new Person { Name = "Nicolas", LastName = "Herrera", Twitter = "@nicolocodev"},
			new Person { Name = "Jorge", LastName = "Ramirez", Twitter = "@jramirezdev"},
			new Person { Name = "Nelson", LastName = "Venegas", Twitter = "@nvenegar"}
		};

		persons.ForEach(c => context.Person.Add(c));
		context.SaveChanges();
	}
}

Ahora en el Application_Start() del Global.asax lo definimos:

protected void Application_Start()
{
	...
	Database.SetInitializer(new PersonDBInitializer());
}

Y para finalizar con el tema asociado definimos la cadena de conexión en el web.config:

<connectionStrings>
	<add name="PersonDBContext"
		connectionString="Data Source=.;
		Initial Catalog=test;Integrated Security=True"
		providerName="System.Data.SqlClient" />
</connectionStrings>

Ahora volviendo al tema de Web API, es hora de crear el controlador, y para ello Web API nos ayuda bastante; damos click derecho en la carpeta Controllers, luego Add -> Scaffold:

scaffold

Luego seleccionamos Web API 5 with read/write actions, using Entity Framework, y en la ventana que se abre definimos el nombre del contralor, el modelo y el contexto de base de datos:

template

configuration

Una vez finaliza la creación del controlador, el asistente nos ha creado el controlador con todas las acciones CRUD:

public class PersonController : ApiController
{
	private PersonDBContext db = new PersonDBContext();

	// GET api/Person
	public IEnumerable GetPerson()
	{
		return db.Person.AsEnumerable();
	}

	// GET api/Person/5
	public Person GetPerson(Int32 id)
	{
		Person person = db.Person.Find(id);
		if (person == null)
		{
			throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
		}

		return person;
	}

	// PUT api/Person/5
	public HttpResponseMessage PutPerson(Int32 id, Person person)
	{
		if (!ModelState.IsValid)
		{
			return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
		}

		if (id != person.Id)
		{
			return Request.CreateResponse(HttpStatusCode.BadRequest);
		}

		db.Entry(person).State = EntityState.Modified;

		try
		{
			db.SaveChanges();
		}
		catch (DbUpdateConcurrencyException ex)
		{
			return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
		}

		return Request.CreateResponse(HttpStatusCode.OK);
	}

	// POST api/Person
	public HttpResponseMessage PostPerson(Person person)
	{
		if (ModelState.IsValid)
		{
			db.Person.Add(person);
			db.SaveChanges();

			HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, person);
			response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = person.Id }));
			return response;
		}
		else
		{
			return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
		}
	}

	// DELETE api/Person/5
	public HttpResponseMessage DeletePerson(Int32 id)
	{
		Person person = db.Person.Find(id);
		if (person == null)
		{
			return Request.CreateResponse(HttpStatusCode.NotFound);
		}

		db.Person.Remove(person);

		try
		{
			db.SaveChanges();
		}
		catch (DbUpdateConcurrencyException ex)
		{
			return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
		}

		return Request.CreateResponse(HttpStatusCode.OK, person);
	}

	protected override void Dispose(bool disposing)
	{
		db.Dispose();
		base.Dispose(disposing);
	}
}

Revisando entonces cada una de las acciones, podemos ver que todas las operaciones CRUD ya fueron implementadas, y en este caso el nombre de cada acción tiene una fuerte relación con el nombre de los verbos Http:

Acción Verbo Http Funcionalidad
GetPerson Get Obtener todos los elementos
GetPerson  (Int32 id) Get Obtener un elemento por id
PutPerson (Int32 id, Person person) Put Actualizar elemento por su id
PostPerson(Person person) Post Insetar un nuevo elemento
DeletePerson(Int32 id) Delete Eliminar elemento

Ahora ya tenemos todo listo para comenzar a consumir el servicio, lo cuál revisaremos en el próximo post.

Saludos.

Descarga el ejemplo!

3 comentarios sobre “[ASP.NET Web API] Web API II – Creando un CRUD, trabajando con verbos Http

    […] revisamos como crear un servicio con ASP.NET Web API y además como crearlo para trabajar un CRUD completo, pero hasta ahora no hemos consumido el servicio, lo cual es el objetivo de este […]

    […] [ASP.NET Web API] Web API II – Creando un CRUD, trabajando con verbos Http […]

    David escribió:
    02/25/2014 en 12:06

    necesito un ejemplo como este pero trabajando con colecciones de objetos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s