2012-09-11 15 views
36

Tengo el siguiente Web API (GET):¿Cómo desarrollar una API web ASP.NET para aceptar un objeto complejo como parámetro?

public class UsersController : ApiController 
{ 
    public IEnumerable<Users> Get(string firstName, string LastName, DateTime birthDate) 
    { 
     // Code 
    } 
} 

Es un GET, por lo que se puede llamar así:

http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 

y recibir un resultado XML de usuario (s).

¿Es posible encapsular parámetros a una clase como esta:

public class MyApiParameters 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public DateTime BirthDate {get; set;} 
} 

y luego tener:

public IEnumerable<Users> Get(MyApiParameters parameters) 

Lo he intentado y en cualquier momento que intenta conseguir el resultado de http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 , el parameter es nulo.

Respuesta

62

Por defecto, los tipos complejos se leen del cuerpo, por eso se obtiene nulo.

modificar la firma acción para

public IEnumerable<Users> Get([FromUri]MyApiParameters parameters) 

si desea que el aglutinante de modelo para tirar el modelo de la cadena de consulta.

Usted puede leer más acerca de cómo Web API hace el enlace de parámetros en el excelente artículo de Mike Stall de MSFT - http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

+0

Buena atrapada. ¡Sé que me estaba perdiendo algo! :) – Tohid

+0

Esto parece morderme CADA VEZ ÚNICO Vuelvo al desarrollo de la API web. Ojalá Swashbuckle hiciera algo para asegurarse de que la Web API y ella estuvieran sincronizadas con sus suposiciones sobre si estos datos vienen o pasan como datos de la cadena de consulta o datos corporales. Y desearía que Web API NO suponga que se leen tipos complejos de las llamadas de Body on GET, eso no tiene sentido alguna vez y especialmente no como un valor predeterminado. Gracias Tohid y @Filip: esta pregunta me ha salvado en numerosas ocasiones. – Jaxidian

Cuestiones relacionadas