2013-01-04 9 views
10

Gibt es eine Möglichkeit, eine Web-API durch "GET" abzufragen, aber mit komplexen Objekt in seinem Parameter?Mvc Web API komplexe Objektabfrage über GET

Alle Beispiele, die ich bisher gesehen habe, scheinen darauf hinzuweisen, dass ich "POST" verwenden müsste. Aber ich möchte nicht "POST" verwenden, weil dies eine Abfrage ist, gleichzeitig möchte ich keine Funktion mit 16 Argumenten, weil das nur brüchig schreit.

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

Ich möchte, dass die oben in gedreht werden:

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

Gibt es eine Möglichkeit, dies zu tun? Und wie lässt sich der HttpClient mit dem oben genannten Service arbeiten?

+1

Nein, Sie können ein Modell nicht über eine GET-Anfrage übergeben. Die übliche Vorgehensweise besteht darin, die ID an die Methode zu übergeben und dann den Rest der Daten von der Quelle abzurufen. –

Antwort

19

Sie könnten die ProductQuery Parameter [FromUri] übergeben werden müssen.

Lassen Sie uns sagen, dass dies Ihre ProductQuery Klasse:

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

Sie Ihre Aktionsparameter mit [FromUri] mit Anmerkungen versehen können ...

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

... und haben Eigenschaften von ProductQuery (dh Id, Name , ...) kann aus dem Query String im Uri übernommen werden:

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

Klingt gut, ich kann es zwingen, Modellbinder zu verwenden, nehme ich an. – Alwyn

3

Vielleicht möchten Sie sich die OData-Unterstützung in der Web-API ansehen - vielleicht würde das tun, was Sie wollen? Kommt darauf an, wie kompliziert die Umsetzung Ihrer Anfrage ist!

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

+0

Ich stimme Richard zu. Wenn es sich um eine öffentliche API handelt, können Probleme auftreten, bei denen ein Client eine GET-Anforderung mit einem Textkörper möglicherweise nicht unterstützt. Diskutiert mehr unter http://stackoverflow.com/questions/11091160/rest-api-get-request-with-body. – smlync

+0

Kann ein POST OData unterstützen? Nicht die erholsame Art - ich denke. Das ist hart, ich muss mich zwischen schlechter Übung und dem Verlust der OData-Unterstützung entscheiden. – Alwyn

+0

Ich bin mir nicht sicher, warum Sie OData nicht verwenden möchten. Wenn Sie eine Bibliothek wie [AutoMapper] (https://github.com/AutoMapper/AutoMapper) verwenden, können Sie nur die Eigenschaften Ihres Modells anzeigen, die Sie möchten. Sie können einige ziemlich komplexe Abfragen mit OData durchführen, also würde ich @Richard zustimmen und mit Odata gehen. – TYRONEMICHAEL