2017-09-27 32 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中的表示方式。当你考虑它时,它们是两个不同的概念。 –