Hola, la intención de este post no es más que aclarar un poco el cómo es posible enviar parámetros a un método POST en Web API, ya que he visto existe un poco de confusión al respecto.


Tenemos dos posibles opciones, enviar los datos en la misma URL (Query String) o enviarlos en el body del request, su uso es realmente simple, así que primero veamos por Query String, si tenemos un método (HttpPost) que recibe tres parámetros, es posible declarar explícitamente el nombre del campo y su valor directamente en la URL, el método (action) en Web API sería:


[HttpPost]
public void Post(string userId, string name, string lastName)
{
    //Do something
}

Y para llamarlo: http://localhost:32328/api/Users?userId=1&name=julio&lastname=avellaneda, podemos aprovechar el routing por atributos (oficialmente disponible desde Web API v2) para cambiar el cómo realizar el binding, reescribiendo el método quedaría:


[HttpPost]
[Route("Users/Save/{userId}/{name}/{lastName}")]
public void Post(string userId, string name, string lastName)
{
    //Do something
}

Y para llamarlo: http://localhost:32328/Users/Save/1/julio/avellaneda, puedes ver más sobre routing por atributos en el siguiente link: Routing por atributos en Web API

Ahora, cuando se tienen varios parámetros no es muy agradable enviarlos todos por la URL, y en estos casos es mejor crear una clase que encapsule los parámetros requeridos y enviarlos en el body de la petición, para este caso es necesario crear una clase y reescribir el método:



public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string LastName { get; set; }
}

[HttpPost]
public void Post([FromBody] User user)
{
    //Do something
}

Y para llamarlo, en este caso se debe enviar el objeto en el body del documento, la siguiente imagen muestra cómo es posible hacerlo utilizando Fiddler:

alt

Espero el post sea interesante y ayude a aclarar un poco más el tema.

Saludos!