2012-09-11 6 views
36

Mam następujący API Web (GET):Jak opracować interfejs API sieci ASP.NET, aby zaakceptować obiekt złożony jako parametr?

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

Jest to GET, więc mogę nazwać tak:

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

i otrzymać wynik xml użytkownika (-ów).

Czy można upakować parametry do jednej klasy tak:

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

I wtedy:

public IEnumerable<Users> Get(MyApiParameters parameters) 

Próbowałem go i wszędzie staram się uzyskać wynik od http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 , parameter ma wartość null.

Odpowiedz

62

Domyślnie typy złożone są czytane z treści, dlatego uzyskuje się wartość zerową.

Zmień swój podpis działania w celu

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

jeśli chcesz spoiwo modelu wyciągnąć model z kwerendy.

można przeczytać więcej na temat Web API robi parametr wiązania w znakomitym artykule Mike Stall od MSFT - http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

+0

Niezły chwyt. Wiem, że czegoś mi brakowało! :) – Tohid

+0

To wydaje mi się gryźć KAŻDY POJEDYNCZY CZAS Wracam do programowania Web API. Chciałabym, aby Swashbuckle zrobił coś, aby upewnić się, że interfejs Web API był zsynchronizowany z ich założeniami, czy te dane przychodzą/pojawiają się jako zapytania o dane lub dane o ciele. I chciałbym, aby interfejs Web API NIE zakładał, że złożone typy były odczytywane z wywołań Body na GET - to nie ma sensu, a zwłaszcza nie jako domyślne. Dzięki Tohid i @Filip - to pytanie zaoszczędziło mi wiele razy! – Jaxidian

Powiązane problemy