2013-01-04 23 views
10

"GET"を介してWeb APIにクエリを送信する方法はありますか?そのパラメータには複雑なオブジェクトがありますか?Gv経由のMvc Web API複合オブジェクトクエリ

私がこれまで見てきたすべての例は、「POST」を使用しなければならないことを示しているようです。しかし、私は "POST"を使いたくないのですが、これはクエリなので、同時に16個の引数を持つ関数が欲しいとは思えません。これを実行する方法はあり

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

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

は、私は上記のに変えることにしたいですか?そして、HttpClientを上記のサービスでどのように動作させるか

+1

いいえ、GETリクエストでモデルを渡すことはできません。一般的な方法は、idをメソッドに渡し、残りのデータをソースから取得することです。 –

答えて

19

あなたはProductQueryパラメータが[FromUri]を渡される可能性があります。

のは、これはあなたのProductQueryクラスであるとしましょう:あなたは[FromUri] ...

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

であなたのアクションパラメータに注釈を付けることができます

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

...とProductQueryの性質(すなわちIdを持って、Name 、...)は、Uriのクエリ文字列から渡すことができます。

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

偉大な音、私はそれが仮定するモデルバインダーを使用するように強制することができます。 – Alwyn

3

Web APIのODataサポートを見てみるといいかもしれません。クエリの実装がどれほど複雑かによって異なります。

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

+0

私はリチャードに同意します。公開APIの場合、クライアントがGETリクエストをサポートしていない可能性がある問題が発生する可能性があります。 http://stackoverflow.com/questions/11091160/rest-api-get-request-with-bodyでさらに議論されています。 – smlync

+0

POSTでODataをサポートできますか?安らかな種類ではありません - 私は推測します。これは厳しいですが、私は悪い習慣とODataのサポートを失うことのどちらかを選択する必要があります。 – Alwyn

+0

ODataを使用したくない理由がわかりません。 [AutoMapper](https://github.com/AutoMapper/AutoMapper)のようなライブラリを使用する場合、あなたが望むモデルのプロパティだけを公開することができます。 ODataを使ってかなり複雑なクエリを行うことができるので、@ Richardに同意し、Odataと一緒に行くでしょう。 – TYRONEMICHAEL

関連する問題