2014-12-04 82 views
4

在ASP Web API 2中,我希望在我的REST URI中實現搜索功能。Web API 2:如何搜索

舉例來說,如果我有資源的客戶

/base_url/customers 
/base_url/customers/1 
.... 

我想例如實現:

/base_url/customers?active=true 

我如何能實現在Web API 2控制器搜索? (我不想使用OData協議,因爲我有DTO對象:我的控制器必須與DTO對象連接,而不是直接與模型對象連接)。

回答

6
  1. 定義一個搜索選項類,其中包含希望客​​戶端搜索的所有屬性。讓我們把它叫做CustomerSearchOptions現在:

    public class CustomerSearchOptions 
    { 
        public bool IsActive { get; set; } 
    
        public string AnotherProperty {get; set;} 
    } 
    
  2. 您的API控制器變型CustomerSearchOptions的參數上定義一個Get方法,並通過[FromUri]屬性來修飾的參數。

  3. get方法的實施將使用搜索選項搜索你的資料庫,並返回匹配的數據(MyCustomerDto):

    [HttpGet] 
        [ResponseType(typeof(List<MyCustomerDto>))] 
        public async Task<IHttpActionResult> SearchAsync([FromUri] CustomerSearchOptions searchOptions) 
        { 
         if (searchOptions == null) 
         { 
          return BadRequest("Invalid search options"); 
         } 
    
         var searchResult = await myRepo.SearchAsync(searchOptions); 
    
         return Ok(searchResult); 
        } 
    
  4. 您的Web API的客戶端需要調用你的API將查詢字符串中的搜索選項傳遞給消息體中的NOT。

/BASE_URL /客戶?isActive = TRUE & anotherProperty = someValue中

這就是全部。

希望有所幫助。

0

除非您強烈需要控制傳入的查詢表達式,否則我會強烈考慮使用ASP.net ODATA接口http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api,尤其是http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#examples。這顯示了您的端點如何返回一個IQueryable,然後消費者可以使用ODATA語法進行查詢。

+0

剛纔我嘗試使用ODATA的經歷是我做出的最糟糕的決定之一,也是最令人討厭的週末之一。當我回顧代碼時,我不知道它是如何工作的。 – 2018-01-02 20:36:32

2

如果可能,你應該按照上面描述的方法將查詢放在url中,但是你也必須記住api的設計是爲了讓開發人員的工作更輕鬆。如果您的搜索條件複雜,則可能無法使用。

我們有一個客戶服務團隊,他們希望有一個沖洗版本的實體暴露範圍和條件爲每個屬性,他們希望能夠訪問一些相關的屬性以及。雖然我們可以在URL中完成這項工作,但它會驅使我們的前端團隊堅果!所以我們採用了POSTs to .../api/entity/queries的慣例將用於這些複雜的搜索。

起初,我被認爲使用這樣的POST,但它確實使整個過程更簡單。