2017-09-08 71 views
0

我需要能夠擁有相同的路由來獲取兩種不同的輸出。通過查詢字符串區分路由

/api/v1/items?ids=1,2,3 

應檢索包含這三個項目的項目列表,但

/api/v1/items?from=142523&limit=4 

應檢索光標分頁響應,其中from將是項目的ID。

我知道,在過去,有可能創建一個基於查詢字符串路線的限制,但根據我們在此處發佈答案已被刪除: Query parameter route constraints

會是什麼來解決這個最好的方法是什麼?屬性路由是一個禁止行爲,因爲我們不希望在應用程序中擁有items/{list-of-ids}路由。我可以將這些方法合併到一個帶有可選參數的方法中,但是在自動生成的文檔(分頁與非分頁響應)中API輸出不一致。是否有可能實現我想要使用自定義路由約束?

+0

我不會說你會得到兩種不同的輸出,而你得到的獨立路徑得到的參數綁定同樣的,只是一個更大的集合的不同表示。另外請考慮您可能希望限制未過濾的請求,以便您不返回所有結果。 –

回答

2

您可以使用Optional Parameter來定義您的API端點,如下所示。您的查詢字符串值將自動如果保持參數名稱相同,不必爲它們定義

[HttpGet] 
public IActionResult items(string ids, int from = 0, int limit = 0) 
{ 
    //code here 
} 
+0

我實際上需要將這兩個方法分開,因爲它們有一個定義的輸出類型(一個自定義的PaginatedResponse和一個項目列表),然後在Swagger API文檔中可見。 – Slowacki

+1

爲什麼不只是返回兩種情況下的物品清單?只要過濾器存在,以便客戶端可以分頁,爲什麼服務器需要處理它?例如,'items?take = 10',然後是'items?skip = 10&take10',然後可以很好地映射到LINQ,並且'IQueryable '如果需要的話 –

+0

這不是我可以控制的東西。 API使用相同的包裝類作爲對包含分頁的所有請求的響應。 API消費者期望它,我不能刪除/更改它。實際上,我需要創建另一個方法併爲其創建一個單獨的路由,以便在生成的文檔中將其顯示爲基於查詢字符串約束(具有不同結構的json輸出)的完全不同的請求,該查詢字符串約束不再存在於webAPI2中。 – Slowacki