2017-06-17 5 views
0

私はASP.Net WebAPIを初めて使用しており、NorthWindデータベースを使用して練習しようとしています。 今、私はGetAllProductsGetAllProductsByIdアクションを含むProductsControllerを持っています。WebAPI - 配列パラメータを渡すときにPOSTを使用してGETのジョブを実行する。何がうまくいかないでしょうか?

クライアント側では、CategoriesControllerクラスの製品のカテゴリが入力された複数選択ドロップダウンコントロールがあります。

カテゴリドロップダウンリストで選択したCategoriesProductsで2番目のドロップダウンコントロール(マルチセレクションではない)を入力したいとします。

マイGetAllProductsByIdコントローラは次のようになります。クライアントからこのサービスを呼び出す

public IHttpActionResult GetAllProductsById([FromUri]int[] id) 
{ 
    using (var ctx = new NorthwindEntities()) 
    { 
     <some codes...> 
    } 
    return Ok(productList); 
} 

、URLは次のようになります。http://localhost:1234/api/Products/GetAllProductsById?id=1&id=2&id=3

これは、いくつかのパラメータを持つよさそうだが、ユーザーはより多くを選択し、どのような場合にはカテゴリ(40カテゴリのうち30カテゴリ)これは、URLが長すぎることを意味します。

だから、私はHttpPostで自分の行動を飾ることでGETの仕事をするためにPOSTを使用することを決定:

[HttpPost] 
public IHttpActionResult GetAllProductsById([FromBody]int[] id) 

これは私が私の要求の本体からidパラメータを送信することができます。

このスタイルが正しいのか、誰かがクライアントからWebサービスに長いパラメータリストを渡す方法を教えてくれるのだろうかと思います。

ありがとうございます。

NB:

  • Elasticsearch使用することで、オプションではありません下のリンクで提案されているように:私はモーダルクラスを使用してみました HTTP GET with request body
  • が、それはまた、同じ効果があり http://localhost:1234/api/Products/GetAllProductsById?input.id=1&input.id=2
+0

リクエストボディで[HTTP GET]を複製する可能性があります(https://stackoverflow.com/questions/978061/http-get-with-request-body) –

+0

提案されたリンクを読みましたが、対処していないようですURL部分。私の心配は、URLに表示されるパラメータの長いリストです。そのため、私は 'POST'を使うことに決めました。しかし、私は、Elasticsearchを使用するより良い方法があるかどうか疑問に思っていました。 – adjaharrison

答えて

1

を支援あなたになる可能性があります。HTTPヘッダーを使用してください。

まずクライアントがHTTPリクエスト(C#の例は、以下)にヘッダとしてIDリストを追加する必要があります。

var webRequest = System.Net.WebRequest.Create(your_api_url); 
webRequest.Headers.Add("X-Hidden-List", serialized_list_of_ids); 

そしてAPI側:

[HttpGet] 
public IHttpActionResult GetAllProductsById() 
{ 
    string headerValue = Request.Headers.GetValues("X-Hidden-List").FirstOrDefault(); 
    if (!string.IsNullOrEmpty(headerValue)) 
    { 
     var results = DeserializeListAndFetch(headerValue); 
     return Ok(results); 
    } 
    else 
    { 
     var results = ReturnEverything(); 
     return Ok(results); 
     // or if you don't want to return everything: 
     // return BadRequest("Oops!"); 
    } 
} 

DeserializeListAndFetch(...)ReturnEverything()なります実際のデータベースのクエリを実行します。

0

モデルクラスにIdの配列を持たせることができ、メソッドパラメータではそのクラスの型を受け入れるだけです。同様

モーダルクラス

Public class modal 
{ 
     Public int[] Ids {get;set;} 
} 

あなたのContoller

public IHttpActionResult GetAllProductsById([FromBody] modal m) 
{ 
//Some logic with m.Ids 
} 

あなたのJSONあなたはこのAPIを消費するために、任意のUIを使用している場合

{"Ids" :[1,2,3,4,5,6]}  

希望これは、

+0

私は、 'GET'メソッドを使用しているときにURLに表示される内容をより心配しています。私の提案では、http:// localhost:1234/api/Products/GetAllProductsById?input.id = 1&input.id = 2'のようなURLを使用します。 – adjaharrison

関連する問題