2012-07-25 3 views
13

CustomerモデルのWeb APIクラスを作成しました。私は標準的なメソッド(GET、POST、PUT、DELETE)を持っています。問題は、私は検索である別のGETメソッドを実装したいということです。このような何か:WebAPIでの検索

[HttpGet] 
public IEnumerable<Customer> Search(string id) 
{ 
    var customers = customerRepository.Search(id); 
    return customers; 
} 

検索方法は.Contains()方法を使用して、私の顧客の口座番号に基づいて検索を実行します。

問題は、私が移動したときに:mySite.com/api/Customers/Search/123私は404を取得します。私はここで何が間違っていますか?

答えて

7

デフォルトのルート設定では、標準コントローラアクション名のみが許可されます(RESTfulなアクション名とディスパッチはHTTP動詞に基づいて行われます)。 RESTful規約に違反し、カスタムアクション名を使用する場合は、URLにアクション名を含めるためにルート設定を変更する必要があります:api/{controller}/{action}/{id}。これで、/api/Customers/Search/123に依頼を送信し、Customers APIコントローラーで検索アクションを呼び出します。

+0

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-apiあたりとしてどのように私は、RESTfulな方法を使ってこれを実現するのでしょうか?別のGETメソッドを使用することはできません。 – CallumVass

+2

別のコントローラを作成します:SearchProductsContollerまたは何でも使用して、その中でGetアクションを使用します。 –

+0

ああ..私が思ったのと同じように、通常どんなことが起こるのだろうか?追加のGETリクエストが必要な場合は、新しいコントローラを追加できますか? – CallumVass

48

Darinの答えは常に最高ですが、この質問は実際にどのAPIで検索、ページング、フィルタリングを実際に行うべきか、Web APIの最新バージョンv2)。

これは私が問題に優れたリソース(技術indenpendent)考えるのポストです: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

答えはまた、ダーリンの答えはかなり古いですので、ASP.NETのWeb API v2のの新機能を反映すべきです。

「asp.net web api searching」のGoogle検索では、この質問がトップに表示されるため、ここではいくつか説明します。

最新バージョンのASP.NET Web API(v2)でRESTの原則に可能な限り近づけるには、最新バージョンで導入された属性ルーティングを真剣に検討する必要があります。古くからの古典的な規則に基づいたルーティング(global.asax.csまたはRouteConfig.cs)を使用してRESTfulルーティングを実現することは非常に困難です。

あなたが尋ねる仕様を実装する方法を詳細に入るために、今ここに http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

それについての詳細をお読みください。

最も一般的な方法は、クエリ文字列パラメータを使用してこれらの種類の機能を公開することです。

パーRESTの原則は、あなたが

/api/customers 

は、あなたがこの

[HttpGet] 
[Route("/api/customers")] 
public HttpResponseMessage GetCustomers(string q="", string sortBy="", string sortDirection="", bool active=true, ...) 
{ 
// q = being optional search query 
// sortBy = optional sort by column/property 
// sortDirection = optional sort direction 
// active = filter on 'active' column/property 
// ... other filters may be applicable 
} 
のようなあなたのウェブAPIコントローラであなたのGetCustomers()アクションを飾るだろうこれを実現するために、たとえば、あなたの顧客のリソースのための1つのエンドポイントを持っている必要があります

フィルタリングされたビューを提供する場合は、このアクションを従来のMVCで行ったことに厳密に実装します。

いくつかのカスタムエッジのケースでは、本当に必要な場合にのみ、新しいコントローラとカスタムアクションを導入します。

SearchFilterの厳密に型指定されたオブジェクトに関するコメントに関しては、GETリクエストを使用するときに既定のモデルバインダーがこのクラスにバインドされないため、これはそのままでは機能しないことを説明しましょう。

したがって、これらのプロパティをSearchFilterクラスから取り出してアクション自体に入れて、クエリ文字列バインダを使用してバインドするか、リクエスト本体からバインドする場合は[FromBody]バインダを使用します。 HTH

+0

素晴らしい答え、古い質問への新しい答えを感謝します。 –

関連する問題