14

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

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

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

問題は、次の場所に移動するとmySite.com/api/Customers/Search/123、404が表示されることです。ここで何が間違っているのでしょうか。

4

2 に答える 2

50

ダリンの回答は常に最高品質ですが、この質問は、検索、ページング、フィルタリングをAPIで実際に実行する方法と、最新バージョンのWeb API(v2)を使用して実行する方法を説明する回答から実際に恩恵を受けます。

これは、この問題に関する優れたリソース(テクノロジーに依存しない)と私が考える投稿です: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

Darinの回答はかなり古いため、回答にはASP.NET WebAPIv2の新機能も反映されている必要があります。

「asp.netwebapisearch」をグーグル検索すると、この質問が一番上に表示されるので、ここでいくつかのことを説明しようと思います。

最新バージョンのASP.NETWebAPI(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の原則に従い、たとえば、顧客リソース用に1つのエンドポイントが必要です。

/api/customers

これを実現するには、Web APIコントローラーでGetCustomers()アクションを次のように装飾します。

[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
}

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

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

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

したがって、これらのプロパティをSearchFilterクラスから取り出してアクション自体に配置し、クエリ文字列バインダーを介してバインドする[FromBody]か、リクエスト本文からバインドする場合はバインダーを使用します。http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-apiによる

HTH

于 2014-01-21T13:26:58.670 に答える
8

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

于 2012-07-25T10:56:20.300 に答える