只是学习REST和ServiceStack并询问如何构建此示例模式的建议:
我有一个User
对象包含这些字段:
public class User
{
public string ID {get;set;
public string Name {get;set;}
public List<int> OrderID {get;set;} // inner collection
// all other fields
}
我有一个Service
课程:
public class UserService : Service
{
public List<User> Get(User UserRequest)
{
List<User> lstUsers = // Somehow polulate a collection of Users
return lstUsers;
}
// Other functions
}
和AppHost文件(暂时自托管)
public UserHost : AppHostHttpListenerBase
{
public override void Configure(Funq.Container container)
{
Routes
.Add<User>("/UserInfo")
.Add<User>("/User/{ID}");
}
}
一切正常:客户端(浏览器)发送一个空的“用户”请求并接收User
个对象的集合,但我需要添加的是获取特定的User
请求。例如,我想接收(并更改)具有特定User
ID的所有订单。
例如,ID = 2的User
的集合为10 OrderID
。所以我虽然可以构建这样的URI:/ MyHost / 2 / Orders,它将返回Order
个对象的集合。
我已经尝试添加另一个DTO对象Order
并将其绑定到这样的路由:
Route.Add<Order>("/User/{ID}/Oders")
但它不起作用。屏幕(至少在浏览器中)始终保持空白,似乎没有来自SS的响应。
这是一种RESFull的做事方式吗?如何在ServiceStack中实现?你能提供一些代码示例(甚至原理图)如何做到这一点?
答案 0 :(得分:3)
如果要返回给定用户的订单列表,那么绑定到URL "/User/{ID}/Orders"
是RESTful方式,是的。
使用ServiceStack,我通常更喜欢定义请求和响应类,其中请求类将具有所有可能的输入参数,响应定义结果对象。虽然这些内容通常可以像示例中的User
那样组合。
由于网址中的{ID}
是指用户ID,因此最好将其命名为{UserID}
,并在您的请求类中使用此属性。
您可以在Order
类上使用UserID:
public class Order
{
public string ID { get; set; } // order ID
public string UserID { get; set; } // user ID - also request param
// ...
}
Routes.Add<Order>("/User/{UserID}/Oders");
现在,来自URL的UserID被映射到您的UserID属性,您可以使用它来查询数据库等。
每个请求类通常对应于具有应用逻辑的另一个服务类。因此,
User
您有UserService : RestServiceBase<User>
,Order
有OrderService : RestServiceBase<Order>
。
当ServiceStack看到此URL映射Routes.Add<Order>("/User/{UserID}/Oders")
时,它知道为给定的URL调用OrderService
。
public class OrderService : RestServiceBase<Order>
{
public override object OnGet(Order request)
{
// ...
}
}