我一直在试验ServiceStack框架来开发一个简单的REST API。我遇到了麻烦,试图正确定义路由来处理我期望的不同网址。如何将多个请求DTO映射到单个路由
我有一个简单的DomainModel类:
public class Student
{
public int Id { get; set; } // unique
public string Email { get; set; } // not unique
// some other properties and business logic
}
我想创造出响应HTTP请求到以下网址REST服务:
/students
- GET返回所有学生
/students/123
- GET返回学生使用id = 123
/students?id=123
- GET返回学生使用id = 123
/[email protected]
- GET返回所有的学生与匹配的电子邮件
我曾尝试使用下面的请求的DTO来完成这项尝试:
[Route("/students", "GET")]
public class GetAllStudents : IReturn<StudentList>
{
}
[Route("/students", "GET")] // I want this to be for /students?Id=
[Route("/students/{Id}", "GET")]
public class GetStudentById : IReturn<Student>
{
public int Id { get; set; }
}
[Route("/students", "GET")] // I want this to be for /students?Email=
public class GetStudentsByEmail : IReturn<StudentList>
{
public string Email { get; set; }
}
正如你所看到的,我只是想用两种不同的反应的DTO:
public class StudentList : List<Student>
{
}
public class Student
{
public int Id { get; set; }
public String Email { get; set; }
}
注:这个Reponse DTO Student
类与我的DomainModel类是分开的;他们在不同的命名空间。
不幸的是,当我尝试使用这些路线时,对/students?<anything>
的每个请求最终都会返回所有学生。唯一能够工作的路由是,如果我向/students/123
发出GET请求,那么我将Id 123返回给Student。我认为这不起作用,因为我正在将多个Request DTO的"/students"
路由定义重新使用。
我一直在阅读ServiceStack wiki和examples,但我无法弄清楚如何完成我所尝试的。我可以找到关于高级路由的最详细的文档是"Smart Routing" section of the "New API" page,但它并没有真正解决这种情况。
如何重新使用多个请求DTO的相同路由定义?
我不确定你可以按照你想要的方式做到这一点。我可以建议路线'/学生/ {Id}'作为替代方案吗? – rossipedia 2013-05-10 19:58:44
@rossipedia即使我摆脱了'/ students?id = 123'的路由,我仍然有'GetAllStudents'和'GetStudentsByEmail'重复路由定义的问题。老实说,我不需要''id ='路线,但是摆脱它不会让我更进一步。也许我误解了你的建议?你能在答案中提供更多细节吗? – 2013-05-10 20:04:57
请参阅下面的@ mythz的答案。他解释得比我更好:) – rossipedia 2013-05-10 20:11:11