ExpressJs条件路由的ServiceStack客户端路由
问题描述:
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(...)]
属性将不可维护。
我不知道是否有一种方法可以在调用之前在运行时生成路由,但这很棒。
答
在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
感谢您的好评。我想,如果这是ServiceStack的唯一解决方案,我将不得不更改我使用的软件包。这太糟糕了,他们不允许你在运行时创建你的路线。我发现它们有点僵化(也许故意)。 关于REST路由应该如何形成,以及当我们在服务器端进行时,我们已经进行了很多辩论,这就是我们选择的方式。您可能有权区分标识符和过滤器在URL中的表示方式。当你考虑它时,它们是两个不同的概念。 –