c# - 如何将多个请求 DTO 映射到单个路由

标签 c# rest url-routing servicestack dto

我一直在试验 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 wikiexamples但我不知道如何完成我正在尝试的事情。我能找到的关于高级路由的最详细文档是 "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 并且您还希望有一个 SearchEmail 上返回多个 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/

相关文章:

c# - 如果类的接口(interface)是逆变的,使用泛型引用类型参数有什么好处吗?

c# - 句柄不支持与 CreateFile 的同步操作

web-services - Restful API - 处理大量数据

java - 泽西 Json 和 Pojo

Java/Android C# linq 的最佳等价物

c# - 这是什么编码,如何使其可读?

rest - Coldfusion 10 REST - 500 内部服务器错误

c# - 如何从 Mvc 中的 HomeController 中删除 Home

javascript - JavaScript 中的 Ruby

php - WooCommerce 复合产品 : How to use URL parameters to change the default product option for a component?