簡體   English   中英

與Rest動詞匹配的ServiceStack新API動作

[英]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路由的解析順序的良好參考:

  1. 首先使用任何精確的文字匹配
  2. 精確動詞匹配優於所有動詞
  3. 路線中的變量越多,其權重就越小
  4. 當路由具有相同的權重時,順序由服務中的操作位置或注冊順序(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM