在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對象連接,而不是直接與模型對象連接)。
在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對象連接,而不是直接與模型對象連接)。
定義一個搜索選項類,其中包含希望客戶端搜索的所有屬性。讓我們把它叫做CustomerSearchOptions現在:
public class CustomerSearchOptions
{
public bool IsActive { get; set; }
public string AnotherProperty {get; set;}
}
您的API控制器變型CustomerSearchOptions的參數上定義一個Get方法,並通過[FromUri]屬性來修飾的參數。
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);
}
/BASE_URL /客戶?isActive = TRUE & anotherProperty = someValue中
這就是全部。
希望有所幫助。
除非您強烈需要控制傳入的查詢表達式,否則我會強烈考慮使用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語法進行查詢。
如果可能,你應該按照上面描述的方法將查詢放在url中,但是你也必須記住api的設計是爲了讓開發人員的工作更輕鬆。如果您的搜索條件複雜,則可能無法使用。
我們有一個客戶服務團隊,他們希望有一個沖洗版本的實體暴露範圍和條件爲每個屬性,他們希望能夠訪問一些相關的屬性以及。雖然我們可以在URL中完成這項工作,但它會驅使我們的前端團隊堅果!所以我們採用了POSTs to .../api/entity/queries的慣例將用於這些複雜的搜索。
起初,我被認爲使用這樣的POST,但它確實使整個過程更簡單。
剛纔我嘗試使用ODATA的經歷是我做出的最糟糕的決定之一,也是最令人討厭的週末之一。當我回顧代碼時,我不知道它是如何工作的。 – 2018-01-02 20:36:32