我一直在试验 ServiceStack框架来开发一个简单的 REST API。我在尝试正确定义路由以处理我想要的不同 URL 时遇到了麻烦。
我有一个简单的 DomainModel 类:
public class Student
{
public int Id { get; set; } // unique
public string Email { get; set; } // not unique
// some other properties and business logic
}
我想创建一个 REST 服务来响应对以下 URL 的 HTTP 请求:
-
/students
- GET 返回所有学生
-
/students/123
- GET 返回 Id = 123 的学生
-
/students?id=123
- GET 返回 Id = 123 的学生
-
/students?email=foo@example.com
- 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; }
}
注意:此响应 DTO Student
类与我的 DomainModel 类是分开的;它们在不同的命名空间中。
不幸的是,当我尝试使用这些路由时,对 /students?<anything>
的每个请求最终返回所有学生。唯一可行的路线是如果我向 /students/123
发出 GET 请求,然后我返回 ID 为 123 的 Student。我认为这不起作用,因为我正在重新使用 "/students"
多个请求 DTO 的路由定义。
我一直在阅读 ServiceStack wiki和 examples但我不知道如何完成我正在尝试的事情。我能找到的关于高级路由的最详细文档是 "Smart Routing" section of the "New API" page但它也没有真正解决这种情况。
如何为多个请求 DTO 重复使用相同的路由定义?
最佳答案
拥有ByXXX
请求 DTO 上的后缀是 ServiceStack 中的代码味道谁想要鼓励设计基于消息的粗粒度接口(interface)。请在 How to design a Message-Based API with ServiceStack 上查看此早期答案以及为什么您应该按响应类型 和调用语义
在这种情况下,您有一项服务执行 Get
Unique Id 返回一个单个 Student 并且您还希望有一个 Search
在 Email 上返回多个 Students。所以在这种情况下,我将拥有以下服务:
[Route("/students/{Id}")]
public GetStudent : IReturn<Student>
{
public int Id { get; set; }
}
这只会处理 /students/123
.
[Route("/students")]
public FindStudents : IReturn<List<Student>>
{
public int? Id { get; set; }
public string Email { get; set; }
}
可以用来处理:
-
/students
-
/students?id=123
//但返回List<Student>
相反 -
/students?email=foo@example.com
-
/students?id=123&email=foo@example.com
- 等等
虽然我个人不会包括 Id
因为它是 Get 而不是 Filter。
关于c# - 如何将多个请求 DTO 映射到单个路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489800/