2013-01-04 16 views
10

Czy istnieje sposób na zapytanie do interfejsu API przez "GET", ale ze złożonym obiektem w jego parametrze?Zapytanie obiektu złożonego MVC Web API za pośrednictwem GET

Wszystkie przykłady, które do tej pory widziałem, wskazują na to, że będę musiał użyć "POST". Ale nie chcę używać "POST", ponieważ jest to kwerenda, a jednocześnie nie chcę funkcji z 16 argumentami, ponieważ to po prostu krzyczy kruche.

public Product Get(int id, string name, DateTime createdBy, string stockNumber, ...) 
    { 
      ... 
    } 

chcę wyżej zamieni się:

public Product Get(ProductQuery query) 
    { 
      ... 
    } 

Czy istnieje sposób, aby to zrobić? I jak sprawić, aby HttpClient działał z powyższą usługą.

+1

Nie, nie można przekazać modelu za pomocą żądania GET. Powszechną praktyką jest przekazanie id do metody, a następnie pobranie pozostałej części danych ze źródła. –

Odpowiedz

19

Można mieć parametr ProductQuery być przekazywane [FromUri].

Powiedzmy to klasa ProductQuery:

public class ProductQuery 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedBy { get; set; } 
    public string StockNumber { get; set; } 
} 

można opisywać swoje parametry działania z [FromUri] ...

public Product Get([FromUri] ProductQuery productQuery) 
    {...} 

... i mają właściwości ProductQuery (tj Id, Name , ...) można przekazać z ciągu zapytania w pliku Uri:

http://.../api/products?Id=1&Name=Product1&CreatedBy=1/4/2013&StockNumber=ABC0001 
+0

Brzmi świetnie, mogę wymusić użycie spinacza modelu. – Alwyn

3

Być może zechcesz spojrzeć na obsługę OData w Web API - może to byś zrobił, co chcesz? Zależy od tego, jak skomplikowana jest realizacja zapytania!

http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

Zgadzam się z Richardem. Jeśli jest to publiczne api, mogą pojawić się problemy, w których klient może nie obsługiwać żądania GET w treści. Omówiono więcej na http://stackoverflow.com/questions/11091160/rest-api-get-request-with-body. – smlync

+0

Czy narzędzie POST obsługuje OData? Nie ten spokojny - chyba. Jest to trudne, muszę wybrać między złym treningiem a utratą wsparcia OData. – Alwyn

+0

Nie jestem pewien, dlaczego nie chcesz używać OData? Jeśli używasz biblioteki takiej jak [AutoMapper] (https://github.com/AutoMapper/AutoMapper), możesz ujawnić tylko właściwości swojego modelu, który chcesz. Możesz wykonać dość złożone zapytania za pomocą OData, więc zgodzę się z @Richard i pójdę z Odatą. – TYRONEMICHAEL

Powiązane problemy