ServiceStack中的REST路由

Jas*_*per 5 servicestack

我刚刚开始学习REST和ServiceStack,并且有些东西Route我不太明白.例如,如果我们从GitHub教程中获取非常基本的HelloWorld示例并重新编写它以返回User对象集合.这是一个例子:

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 };
   }
} 
Run Code Online (Sandbox Code Playgroud)

现在一切正常,没有问题.但现在我想添加另一个路由网址: /Hello/{name}/Address

实际上,对此url的此调用(GET)将返回UserAge参数选择的单个.我怎么能这样做?我应该添加另一个Service?如果网址是:

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

看来我听不懂......

myt*_*thz 3

有关ServiceStack 中的路由的详细信息,请参阅之前的答案。ServiceStack 的新 API中的智能路由部分解释了更多选项和不同的优先级。

您的示例存在一些问题。第一个 ServiceStack 文本序列化程序仅支持公共属性,因此您需要更改用户模型以使用公共属性而不是字段,例如:

public User
{
    public string Name { get; set; }
    public string Address { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

其次,DTO 上的接口是一个坏主意,因为没有充分的理由这样做。它们仍然受到支持,但您最终可能会得到不良结果。使用像 a 这样的具体集合,List<T>它提供了更多实用性,例如:

public class HelloResponse
{
    public List<User> Results { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此外,路由应该与 DTO 上的属性名称完全匹配,它们在与请求路径匹配时不区分大小写,但它们需要映射到确切的属性名称,例如:

/Hello/{Name}/{Age}/Address
Run Code Online (Sandbox Code Playgroud)