2017-09-27 96 views
1

ExpressJs允許您匹配條件(又名動態或模糊)路由匹配。像GET '/people(/sex/:sexFilter)?(/age-over/:ageOverFilter)?'ExpressJs條件路由的ServiceStack客戶端路由

的路由將匹配下面的例子:
/people
/people/sex/female
/people/sex/female/age-over/30
和(最重要的)/people/age-over/30

我不知道是否有配置ServiceStack的方式(一C#Xamarin應用程序)客戶端,如果請求dto對象屬性被留下,將生成以下路由null如:

HttpService.Instance.Get<Person[]>(new SearchPeopleRoute() { sexFilter = "female" }); 
// Generates /people/sex/female 

HttpService.Instance.Get<Person[]>(new SearchPeopleRoute() { ageOverFilter = 30 }); 
// Generates /people/age-over/30 

該解決方案需要可擴展到許多搜索過濾器,因此對於每個過濾器排列具有[Route(...)]屬性將不可維護。

我不知道是否有一種方法可以在調用之前在運行時生成路由,但這很棒。

回答

1

在ServiceStack你需要列出你希望服務能夠與被調用,例如不同的路線:

[Route("/people")] 
[Route("/people/sex/{Sex}")] 
[Route("/people/sex/{Sex}/age-over/{AgeOver}")] 
public class SearchPeopleRoute 
{ 
    public string Sex { get; set; } 
    public int? AgeOver { get; set; } 
} 

的C#/。NET的服務客戶端,然後選擇基於最合適的路由什麼請求DTO被填充。

對於ServiceStack查詢鼓勵你使用?queryString應用任何過濾器哪個更適合設計HTTP的API爲/path/info用於識別而?queryString的資源用於修飾適用於資源請求。

這種約定是embraced in AutoQuery,它可以讓你定義一個請求DTO喜歡:

[Route("/people")] 
public class SearchPeople : QueryDb<Person> {} 

而且無需執行實施,將讓您查詢implicit conventions有關Person表,其中上述自動查詢請求DTO任何領域自動支持以下查詢:

/people 
/people?sex=female 
/people?ageOver=30 
/people?sex=female&ageOver=30 
+0

感謝您的好評。我想,如果這是ServiceStack的唯一解決方案,我將不得不更改我使用的軟件包。這太糟糕了,他們不允許你在運行時創建你的路線。我發現它們有點僵化(也許故意)。 關於REST路由應該如何形成,以及當我們在服務器端進行時,我們已經進行了很多辯論,這就是我們選擇的方式。您可能有權區分標識符和過濾器在URL中的表示方式。當你考慮它時,它們是兩個不同的概念。 –