2012-12-16 8 views
5

私はRESTとServiceStackを学び始めました。ちょっと理解できないものがRouteです。たとえば、GitHubチュートリアルの基本的なHelloWorldの例をとり、Userオブジェクトのコレクションを返すように書き直す場合などです。ここに例があります:ServiceStackでのRESTルーティング

public User 
{ 
    public string Name; 
    public string Address; 
    public int Age; 
} 


// Hello - request object without [Route] attribute 
public class Hello 
{ 
    public string Name { get; set; } 
} 

public class HelloResponse 
{ 
    public IEnumerable<User> Result {get;set;} 
} 


public class HelloService : Service 
{ 
    public object Any(Hello request) 
    { 
     return new HelloResponse { // Collection of User object }; 
    } 
} 

ここではすべて正常に動作し、問題はありません。 Ageパラメータによって選択された単一Userを返します。このURLへ/Hello/{name}/Address

実はこのコール(GET):しかし、今、私は次のように別のルーティングのURLを追加します。どのように私はこれを行うことができますか? Serviceを追加する必要がありますか?そして、URLは次のようになります場合:

/Hello/{name}/{age}/Address

私が何かを理解していないようだ.....

答えて

3

Routing in ServiceStackの詳細については、この先に答えを参照してください。 ServiceStack's New APIのスマートルーティングセクションでは、さらなるオプションとさまざまな優先順位について説明しています。

例にはいくつか問題があります。まずServiceStackテキストシリアライザはパブリックプロパティにをサポートしていますので、代わりにフィールド、例えばのパブリックプロパティを使用するようにユーザーモデルを変更する必要があります。

public User 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public int Age { get; set; } 
} 

次に、Interfaces on DTOs are a bad ideaそれには正当な理由がありませんよう。それらはまだサポートされていますが、望ましくない結果に終わる可能性があります。例えば、より多くのユーティリティを提供していList<T>のような具体的なコレクションを使用します。また、ルートがあなたのDTO 正確プロパティ名と一致する必要があります

public class HelloResponse 
{ 
    public List<User> Results { get; set; } 
} 

要求パスに対して照合時に、彼らは、大文字と小文字を区別しません彼らは正確なプロパティ名にマップする必要があります:

/Hello/{Name}/{Age}/Address 
+0

私は 'Route.Add'関数を誤解しているようです。私が間違っている場合は私を修正してください! Route.Add ( "/ /{DTO-field-name}/{DTO-field-name}"のスキーマは、 ")。クライアント側では、DTO型と実際のHTML動詞(POST/GET)のようなパラメータを持つ関数でサーバー上でdeserializeされ、urlとして設定されたフィールドを持つ完全なDTOオブジェクトにシリアル化されましたか?それは一般的に正しいですか? – Jasper

+0

'Route.Add ()'と '[Route]'属性はまったく同じです。つまりそれらは両方ともリクエストDTOに適用されますが、ルート自体に一致させるテキストリテラルを指定できます。 Routeの変数はRequest DTOフィールドにマップする必要があります。 – mythz

関連する問題