ServiceStack与Rest谓词匹配的新API操作



在旧版本中,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?
}

Action名称"Get"one_answers"Post"不再标记为"override",SS如何匹配正确的动词来命中Get()和Post()函数?

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

或者第二轮,现在我有一个修改。。。

//-----------------------------------------
[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如何区分上述情况下的动词?

你能帮我解决这两个问题吗?非常感谢。

这是智能路由部分,摘自新API维基页面:

匹配规则

在大多数情况下,你不需要知道这一点,因为ServiceStack的路由正如你所期望的那样工作。尽管这仍然可以作为描述ServiceStack路线的解析顺序的良好参考:

  1. 首先使用任何精确的文字匹配
  2. 精确谓词匹配优于所有谓词
  3. 路线中的变量越多,权重就越小
  4. 当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) { ... }     
}

首先声明的动作上的路线被选中,即:

GET /req/1              => Req1

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

你的例子似乎很好,你发现它们有什么问题吗?

相关内容

  • 没有找到相关文章

最新更新