[ASP.NET Web API] IHttpActionResult, ahora en Web API 2

Posted on Actualizado enn


Hola a todos, una de las nuevas características que me ha gustado mucho de Web API 2 es que ahora podemos definir como respuesta un IHttpActionResult, y esto básicamente reemplaza a las respuesta con HttpResponseMessage y nos hace la vida mucho más fácil.

Así que iniciemos, partimos de un modelo muy sencillo:

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

y un contexto:

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

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

Ahora, añadimos un nuevo item, primero seleccionamos New Scaffolded Item:

IHttpResult1

Luego Web API 2 Controller with actions, using Entity Framework:

IHttpResult2

Y finalmente le damos un nombre, seleccionamos el modelo y el contexto (dejamos para otro post la casilla Use async controller actions):

IHttpResult3

Y el resultado es:

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

	// GET api/Person
	public IQueryable<Person> GetPerson()
	{
		return db.Person;
	}

	// GET api/Person/5
	[ResponseType(typeof(Person))]
	public IHttpActionResult GetPerson(int id)
	{
		Person person = db.Person.Find(id);
		if (person == null)
		{
			return NotFound();
		}

		return Ok(person);
	}

	// PUT api/Person/5
	public IHttpActionResult PutPerson(int id, Person person)
	{
		if (!ModelState.IsValid)
		{
			return BadRequest(ModelState);
		}

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

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

		try
		{
			db.SaveChanges();
		}
		catch (DbUpdateConcurrencyException)
		{
			if (!PersonExists(id))
			{
				return NotFound();
			}
			else
			{
				throw;
			}
		}

		return StatusCode(HttpStatusCode.NoContent);
	}

	// POST api/Person
	[ResponseType(typeof(Person))]
	public IHttpActionResult PostPerson(Person person)
	{
		if (!ModelState.IsValid)
		{
			return BadRequest(ModelState);
		}

		db.Person.Add(person);
		db.SaveChanges();

		return CreatedAtRoute("DefaultApi", new { id = person.Id }, person);
	}

	// DELETE api/Person/5
	[ResponseType(typeof(Person))]
	public IHttpActionResult DeletePerson(int id)
	{
		Person person = db.Person.Find(id);
		if (person == null)
		{
			return NotFound();
		}

		db.Person.Remove(person);
		db.SaveChanges();

		return Ok(person);
	}

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

	private bool PersonExists(int id)
	{
		return db.Person.Count(e => e.Id == id) > 0;
	}
}

Ahora, revisando el controlador anterior, notamos que ahora la respuesta de las acciones es un IHttpActionResult, y en esencia la respuesta ahora es mucho más simple para construir, ya que podemos retornar directamente el “resultado” de la operación utilizando los siguientes métodos:

  • Ok()
  • BadRequest()
  • NotFound()

Saludos!

5 comentarios sobre “[ASP.NET Web API] IHttpActionResult, ahora en Web API 2

    Erik Puentes escribió:
    03/10/2014 en 11:35

    No responde el método PUT

      Julio Avellaneda respondido:
      03/10/2014 en 12:48

      Hola Erik, has validado por consola si te genera algún error? por ejemplo ocn firebug?

    Erik Puentes escribió:
    03/10/2014 en 14:44

    sii en moxila firebug me vota el siguiente error

    {“Message”:”El recurso solicitado no admite el método http ‘PUT’.”}

    “NetworkError: 405 Method Not Allowed – http://localhost:50699/api/evento

    estoy trabajando con full calender y es para actualizar el evento cuando lo paso de un dia a otro.

    Erik Puentes escribió:
    03/10/2014 en 14:45

    el json me envía los siguiente.

    El recurso solicitado no admite el método http ‘PUT’.”

      Julio Avellaneda respondido:
      03/31/2014 en 11:24

      Hola Erik voy a revisarlo, sin embargo si te comento que en algunos casos es necesario sobreescribir la cabecera (para verbo put y delete), tengo pendiente un post al respecto.

      Saludos.

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