2012-12-16 9 views
5

Ich fange gerade an, REST und ServiceStack zu lernen, und es gibt etwas über Route, die ich gerade nicht ganz verstehen kann. Zum Beispiel, wenn wir das sehr einfache HelloWorld-Beispiel aus dem GitHub-Tutorial nehmen und es erneut schreiben, um die Sammlung von User-Objekten zurückzugeben. Hier ist ein Beispiel:REST-Routing in ServiceStack

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 }; 
    } 
} 

jetzt funktioniert alles richtig und keine Probleme hier. Aber jetzt will ich wie eine andere Routing-URL hinzuzufügen: /Hello/{name}/Address

Eigentlich dieser Aufruf (GET) zu dieser URL wird eine einzelnes User von Age Parametern ausgewählt zurückzukehren. Wie kann ich das machen? Sollte ich ein weiteres Service hinzufügen? Und wenn die URL wird:

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

Es scheint, dass ich etwas nicht verstehen .....

Antwort

3

Sehen Sie diese frühere Antwort für Details über Routing in ServiceStack. Der Abschnitt Smart Routing unter ServiceStack's New API erläutert weitere Optionen und unterschiedliche Prioritäten.

Es gibt ein paar Probleme mit Ihrem Beispiel. Erster ServiceStack Text Serializer unterstützt nur öffentliche Eigenschaften so müssen Sie Ihr Benutzermodell ändern, anstatt Felder zu verwenden öffentliche Eigenschaften, z:

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

Als nächstes Interfaces on DTOs are a bad idea, da es für sie keinen guten Grund. Sie werden immer noch unterstützt, aber Sie können mit unerwünschten Ergebnissen enden. Verwenden Sie eine konkrete Sammlung wie ein List<T>, die mehr Nutzen bietet, zB:

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

Auch die Routen sollte genau auf dem DTO die Eigenschaftsnamen übereinstimmen, sie sind Groß- und Kleinschreibung, wenn gegen den Request-Pfad übereinstimmt, aber sie müssen auf einen genauen Namen der Eigenschaft abbilden, zB:

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

Danke für die Antwort, aber es scheint, dass ich die 'Route.Add' Funktion falsch verstehe. Bitte korrigieren Sie mich, wenn ich falsch liege! Das Schema für 'Route.Add' ist: Route.Add ("//{DTO-Feldname}/{DTO-Feldname} "). Auf der Client-Seite serialisiert es zu einem vollständigen DTO-Objekt mit Feldern, die in URL gesetzt und auf Server in Funktion deserialisiert sind, die Parameter als DTO-Typ und tatsächliches HTML-Verb (POST/GET) hat? Ist das generell richtig? – Jasper

+0

'Route.Add ()' und '[Route]' Attribut sind genau das Gleiche. d. h. beide gelten für ein Anforderungs-DTO, aber die Route selbst kann ein beliebiges Textliteral sein, das Sie abgleichen möchten. Die Variablen in der Route müssen den Anforderungs-DTO-Feldern zugeordnet werden. – mythz