ServiceStack 新的 API 动作匹配 Rest Verbs

Posted

技术标签:

【中文标题】ServiceStack 新的 API 动作匹配 Rest Verbs【英文标题】:ServiceStack New API Actions matching Rest Verbs 【发布时间】:2012-10-06 15:48:14 【问题描述】:

使用旧版本SomeService : RestServiceBase 可以将 OnGet OnPost OnPut OnDelete 操作与对应的传入动词匹配。

对于较新的版本,假设我有以下内容:

//-----------------------------------------
[Route("/todos/id","GET")] //display request
[Route("/todos/id", "POST")] //edit request
public class Todo : IReturn<TodoResponse> 
    public long Id  get; set; 
    public string Content  get; set; 


public class TodoService : Service 
    public object Get(Todo request)  ...  // will GET verb know this Get() function?
    public object Post(Todo request)  ... // will POST verb know this Post() function?

动作名称“Get”“Post”不再标注“override”,SS如何匹配正确的动词来命中Get()和Post()函数?

//--------------------------------------------- ------------------

或者第2轮,现在我有一个修改......

//-----------------------------------------
[Route("/todos/id","GET")] //display request
public class DisplayTodo : IReturn<TodoResponse> 
    public long Id  get; set; 

[Route("/todos/id", "POST")] //edit request
public class EditTodo : IReturn<TodoResponse> 
    public long Id  get; set; 
    public string Content  get; set; 


public class TodoService : Service 
    //different request DTOs this time ...
    public object Get(DisplayTodo request)  ...  //again, same route "/todos/id" 
    public object Post(EditTodo request)  ...    //will SS get confused about the verbs? 

在同一路由“/todos/id”下,上述情况下SS如何区分动词?

你能帮我解决两个问题吗?谢谢!

【问题讨论】:

【参考方案1】:

这是取自New API wiki page的智能路由部分:

匹配规则

在大多数情况下,您不需要知道这一点,因为 ServiceStack 的路由按您的预期工作。虽然这仍然可以作为描述 ServiceStack 路由的解析顺序的一个很好的参考:

    首先使用任何精确的文字匹配 精确动词匹配优于所有动词 路线中的变量越多,其权重就越小 当 Routes 具有相同的权重时,顺序由 Action 在服务中的位置或注册顺序 (FIFO) 决定

只有当有多个路由与传入请求的 pathInfo 匹配时,这些规则才会起作用。

让我们看看使用新 API 设计测试套件中定义的路由的这些规则的一些示例:

[Route("/reqstars")]
public class Reqstar 

[Route("/reqstars", "GET")]
public class AllReqstars 

[Route("/reqstars/Id", "GET")]
public class GetReqstar 

[Route("/reqstars/Id/Field")]
public class ViewReqstar 

[Route("/reqstars/Id/delete")]
public class DeleteReqstar 

[Route("/reqstars/Id", "PATCH")]
public class UpdateReqstar 

[Route("/reqstars/reset")]
public class ResetReqstar 

[Route("/reqstars/search")]
[Route("/reqstars/aged/Age")]
public class SearchReqstars 

这些是这些 HTTP 请求的结果

GET   /reqstars           =>    AllReqstars
POST  /reqstars           =>    Reqstar
GET   /reqstars/search    =>    SearchReqstars
GET   /reqstars/reset     =>    ResetReqstar
PATCH /reqstars/reset     =>    ResetReqstar
PATCH /reqstars/1         =>    UpdateReqstar
GET   /reqstars/1         =>    GetReqstar
GET   /reqstars/1/delete  =>    DeleteReqstar
GET   /reqstars/1/foo     =>    ViewReqstar

如果有多个完全相同的路由声明如下:

[Route("/req/Id", "GET")]
public class Req2 

[Route("/req/Id", "GET")]
public class Req1 

public class MyService : Service 
    public object Get(Req1 request)  ...      
    public object Get(Req2 request)  ...      

首先声明的 Action 上的 Route 被选中,即:

GET /req/1              => Req1

【讨论】:

【参考方案2】:

ServiceStack 将尝试匹配请求 VERB 及其请求 DTO。 如果其中任何一个不匹配,您将收到一条无请求处理程序消息。

你的例子看起来不错,你遇到过什么问题吗?

【讨论】:

以上是关于ServiceStack 新的 API 动作匹配 Rest Verbs的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack - 检查单元测试中的 WSDL 更改

通过 ServiceStack api 使用 Linq2Twitter 和缓存的 OAuth 令牌

让 servicestack 在 monodroid 上工作

ServiceStack.Redis:配置为使请求和响应类/ dto是同一类?

通过 ServiceStack 运行多个 Redis Sentinel

ServiceStack CORS 功能