C# ServiceStack与Rest谓词匹配的新API操作
使用较旧版本的C# ServiceStack与Rest谓词匹配的新API操作,c#,
servicestack,restful-url,C#,
servicestack,Restful Url,使用较旧版本的SomeService:RestServiceBase可以将OnGet-OnPost-OnPut-OnDelete操作与相应的传入谓词匹配 对于较新的版本,假设我有以下内容: //----------------------------------------- [Route("/todos/{id}","GET")] //display request [Route("/todos/{id}", "POST")] //edit request public class Todo
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?
}
//-----------------------------------------
[Route(“/todos/{id}”,“GET”)]//显示请求
[路由(“/todos/{id}”,“POST”)]//编辑请求
公共类待办事项:IReturn{
公共长Id{get;set;}
公共字符串内容{get;set;}
}
公共类TodoService:服务{
公共对象Get(Todo请求){…}//Get动词是否知道这个Get()函数?
公共对象Post(Todo请求){…}//Post谓词是否知道此Post()函数?
}
动作名称“Get”“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?
}
//-----------------------------------------
[Route(“/todos/{id}”,“GET”)]//显示请求
公共类显示TODO:IReturn{
公共长Id{get;set;}
}
[路由(“/todos/{id}”,“POST”)]//编辑请求
公共类Editodo:IReturn{
公共长Id{get;set;}
公共字符串内容{get;set;}
}
公共类TodoService:服务{
//这次不同的请求DTO。。。
公共对象Get(DisplayTodo请求){…}//同样,相同的路由“/todos/{id}”
公共对象Post(edittorequest){…}//学生会对动词感到困惑吗?
}
在相同的路径“/todos/{id}”下,学生如何区分上述情况下的动词
你能帮我把这两个问题整理一下吗?谢谢大家! ServiceStack将尝试匹配请求谓词及其请求DTO。 如果其中任何一个不匹配,您将得到一条无请求处理程序消息
您的示例似乎不错,您是否遇到过任何问题?这是智能路由部分,摘自: 匹配规则 在大多数情况下,您不需要了解这一点,因为ServiceStack的路由工作方式与您预期的一样。尽管这仍然可以作为描述ServiceStack路由解析顺序的良好参考:
[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