2012-12-16 49 views
5

我刚开始学习REST和ServiceStack,并且有一些关于Route的内容,我只是不太明白。例如,如果我们从GitHub教程中获取非常基本的HelloWorld示例,并重写它以返回User对象的集合。这里是例子:ServiceStack中的REST路由

public User 
{ 
    public string Name; 
    public string Address; 
    public int Age; 
} 


// Hello - request object without [Route] attribute 
public class Hello 
{ 
    public string Name { get; set; } 
} 

public class HelloResponse 
{ 
    public IEnumerable<User> Result {get;set;} 
} 


public class HelloService : Service 
{ 
    public object Any(Hello request) 
    { 
     return new HelloResponse { // Collection of User object }; 
    } 
} 

现在一切工作正常,没有问题在这里。但现在我想添加另一个路由地址,如:/Hello/{name}/Address

其实这个调用(GET)到这个网址将返回Age参数选择单个User。我如何做到这一点?我应该添加另一个Service?而且如果该网址是:

/Hello/{name}/{age}/Address

看来我不明白的地方.....

回答

3

看到这个答案早些时候有关Routing in ServiceStack细节。 ServiceStack's New API中的智能路由部分解释了更多选项和不同的优先级。

你的例子有几个问题。首先ServiceStack文字串行只支持公共属性,所以你需要改变你的用户模型,而不是使用领域的公共属性,e.g:

public User 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public int Age { get; set; } 
} 

接下来,Interfaces on DTOs are a bad idea因为有它没有很好的理由。它们仍然受到支持,但最终会导致不良结果。用一个具体的集合像List<T>它提供了更多的工具,如:

public class HelloResponse 
{ 
    public List<User> Results { get; set; } 
} 

而且路线应与你的DTO 正是属性名称,对请求路径匹配时,他们是不区分大小写,但他们需要映射到一个确切的属性名称,例如:

/Hello/{Name}/{Age}/Address 
+0

感谢您的关注,但似乎我误解了'Route.Add'函数。如果我错了,请纠正我的错误! Route.Add的模式是:Route.Add (“/ /{DTO-field-name}/{DTO-field-name} “)。在客户端,它被序列化为完整的DTO对象,其字段设置为url,并在服务器上反函数化,其参数为DTO类型和实际的HTML动词(POST/GET)?这通常是正确的吗? – Jasper

+0

'Route.Add ()'和'[Route]'属性完全相同。即它们都适用于请求DTO,但路由本身可以是你想要匹配的任何文本文字。 Route中的变量需要映射到Request DTO字段。 – mythz