2012-09-11 15 views
36

Ho la seguente API Web (GET):Come sviluppare un'API Web ASP.NET per accettare un oggetto complesso come parametro?

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

E 'una GET, quindi mi può chiamare in questo modo:

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

e ricevere un risultato XML di utente (s).

E 'possibile incapsulare i parametri per una classe come questa:

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

e poi:

public IEnumerable<Users> Get(MyApiParameters parameters) 

ho provato e in qualsiasi momento cerco di ottenere il risultato di http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 , il parameter è nullo.

risposta

62

Per impostazione predefinita, i tipi complessi vengono letti dal corpo, è per questo che si ottiene null.

modificare la firma azione per

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

se si desidera che il modello di legante per tirare il modello dalla querystring.

Si può leggere di più su come Web API fa parametro vincolante nel eccellente articolo di Mike Stall da MSFT - http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

+0

Bella presa. So che mi mancava qualcosa! :) – Tohid

+0

Questo mi sembra azzoppare OGNI SINGOLO TEMPO torno allo sviluppo dell'API Web. Vorrei che Swashbuckle facesse qualcosa per assicurarsi che esso e Web API fossero in sincronia con le loro ipotesi sul fatto che questi dati arrivino/passino come dati di querystring o dati del corpo. E vorrei che l'API Web non supponesse che i tipi complessi venissero letti dalle chiamate di Body su GET - che non ha senso mai e soprattutto non come default. Grazie a Tohid e @ Filip - questa domanda mi ha salvato molte volte! – Jaxidian

Problemi correlati