使用 WebAPI 搜尋
我為我的
Customer模型製作了一個 Web API 類。我有標準方法(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。我在這裡做錯了什麼?
根據預設路由設置,僅允許使用標準控制器操作名稱(RESTful 和調度是基於 HTTP 動詞完成的)。如果您想違反 RESTful 約定並使用一些自定義操作名稱,那麼您必須修改您的路由設置,以便在 url: 中包含操作名稱
api/{controller}/{action}/{id}。現在您可以發送一個請求,/api/Customers/Search/123該請求將呼叫客戶 API 控制器上的搜尋操作。
雖然 Darin 的答案總是質量上乘,但這個問題實際上會受益於解釋如何在任何 API 中實際完成搜尋、分頁和過濾以及如何使用最新版本的 Web API (v2) 完成的答案。
這是一篇我認為關於此事的好資源(技術獨立)的文章:http: //www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
答案還應該反映 ASP.NET Web API v2 中的新功能,因為 Darin 的答案已經很老了。
由於在Google搜尋“asp.net web api search”時這個問題出現在頂部,我將在這裡嘗試解釋一些事情。
要使用最新版本的 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要實現這一點,您將像這樣在 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高溫高壓