[英]ServiceStack New API Actions matching Rest Verbs
使用舊版本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?
}
動作名稱“獲取”“發布”不再標記為“覆蓋”,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個問題來解答我嗎? 謝謝!
ServiceStack將嘗試匹配請求VERB及其請求DTO。 如果其中任何一個不匹配,您將獲得無請求處理程序消息。
你的例子似乎很好,你有沒有遇到任何問題?
這是從新API維基頁面獲取的智能路由部分:
在大多數情況下,您不需要了解這一點,因為ServiceStack的路由工作正如您所期望的那樣。 雖然這仍然可以作為描述ServiceStack路由的解析順序的良好參考:
當有多個路由與傳入請求的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.