3

古いバージョンでは、SomeService : RestServiceBaseOnGet 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?
}

アクション名「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つの質問で私を整理していただけますか?ありがとうございました!

4

2 に答える 2

4

ServiceStackは、リクエストVERBとそのリクエストDTOの両方を一致させようとします。いずれかが一致しない場合は、リクエストハンドラなしのメッセージが表示されます。

あなたの例は素晴らしいようです、あなたはそれらに何か問題を引き起こしましたか?

于 2012-10-06T16:13:25.887 に答える
4

これは、新しい API wiki ページから取られたスマート ルーティングセクションです。

マッチングルール

ほとんどの場合、ServiceStack のルーティングは期待どおりに機能するため、これについて知る必要はありません。これは、ServiceStack のルートの解決順序を説明するための良い参考資料として引き続き役立つはずですが:

  1. 正確なリテラル一致が最初に使用されます
  2. すべての動詞よりも動詞の完全一致が優先されます
  3. ルート内の変数が多いほど、重み付けが少なくなります
  4. ルートの重みが同じ場合、順序はサービス内のアクションの位置または登録順序 (FIFO) によって決定されます。

これらのルールは、着信リクエストの pathInfo に一致するルートが複数ある場合にのみ機能します。

新しい API Design テスト スイートで定義されたルートを使用して、これらのルールの動作例をいくつか見てみましょう。

[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
于 2012-10-06T16:40:46.107 に答える