gpt4 book ai didi

c# - ServiceStack 新的 API Actions 匹配 Rest Verbs

转载 作者:行者123 更新时间:2023-11-30 13:59:40 24 4
gpt4 key购买 nike

使用旧版本 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”“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如何区分上述情况下的动词?

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

最佳答案

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

匹配规则

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

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

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

GET /req/1              => Req1

关于c# - ServiceStack 新的 API Actions 匹配 Rest Verbs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com