2017-04-27 32 views
0

我目前正在修改我們公司多年來一直使用的舊API。我有一個特定端點調用GetBookings接受的參數的巨量:如何在ASP.net Core中效率過濾RestApi的結果集

public HttpResponseMessage GetBookings(string contactId, string timeFilter = "upcoming", string bookedBy = null, string resourceTypeIds = null, string clientId = null (...), int pageSize = 25, int pageIndex = 0) 
{ 
    (...) 
} 

添加所有這些參數並不感到自然和我一直在尋找這樣做那種事情的另一種方式。

1 /我研究了OData,它似乎提供了一些高級過濾/分頁選項。

看來OData的Microsoft版本是不是最新的(或不維護?)

2 /我還可以再補充下預訂稱爲搜索端點(HttpPost),並接受JSON過濾器。

這種方法不是很安靜,會導致一些緩存問題(因爲HttpPost請求沒有被緩存)。

3 /我也可以添加一個名爲query的參數給我的get bookings端點。該查詢將包含我的過濾器,如'StartDate> = ... AND ....'。

這種方法看起來很複雜,因爲我需要實際解析查詢以轉換爲lambda表達式。我也可以使用短小精悍,但它會很容易受到SQL注入的影響。

4 /我發現的最後一個選項是實際創建接受必要參數的端點。

這很容易實現,但有點醜陋?!

如何在ASP.NET內核WebApi中實現過濾/分頁?

謝謝 勒布

回答

1

我沒有在.NET核心試過,但我的WebAPI將創建一個「標準」或「參數」對象,它包含可以從URL設置的屬性。

例如

public class BookingSearchParameters 
{ 
    public string contactId { get; set; } 

    public string timeFilter { get; set; } 

    etc.. 
} 

然後,我會讓該方法把該對象作爲參數。

[HttpGet()] 
public HttpResponseMessage GetBookings([FromUri] BookingSearchParameters params) 
{ 
    ... do stuff ... 
} 

對於URL給你打電話基本上會做什麼,你做之前,但參數綁定將填充您的參數對象內部的相應值的方法。

如果要將值傳遞到類似的函數,也可以使用相同的對象。

我們將這種方法用於搜索功能,通常從實際的API調用者接收POST,但我可以通過瀏覽器非常容易地將測試值拋出來進行測試。

+0

我試過了,它工作正常。不需要使用屬性[FromUri]。 – Seb