在 ServiceStack 中获取具有多个输入的请求 API

Get request with multiple inputs in ServiceStack API

我正在创建一个接受多个参数的端点。我想知道在 ServiceStack 中执行此操作的正确方法是什么,因为我知道可以这样定义路由:

[Route("/Cars/{EquipmentIds}/{ManufacturerIds}/{ColourIds}")]

但这是否意味着必须在 ManufacturerIds 和 ColourIds 之前定义 EquipmentIds,否则 API 会错误地解释它?

我想指定我使用的参数,然后在没有使用的时候不包括其余的。

不干净的 url 看起来像这样 ?EquipmentIds=1&ColourIds=1

我找到了以下解决方案,但这个是 2011 年的

Multiple Optional Parameters with ServiceStack.Net

是否有新的解决方案,或者这仍然是正确的处理方式吗?

URL 应该是 "resource identifier",其中任何查询字符串参数都是该资源请求的修饰符。

因此,您不应将复杂类型放入 /path/info 中,这不太可能构成该路由的资源标识符的一部分。

您的路线应该自描述其资源标识符。在 URL 中填充一堆匿名 id 并不能使它成为一个干净的 URL,它仍然需要在语义上正确并且在不同路径组件包含的内容上进行自我描述。

当不清楚它用于什么服务时,很难知道要使用的正确路线,但如果这是 汽车搜索服务,则适当的 URL会是这样的:

/cars/search?EquipmentIds=1,2,3&ManufacturerIds=4,5,6&ColourIds=7,8,9

就像当您使用 Google 这样的搜索服务时,他们不会尝试将所有内容打包到路由中,这仅用于标识您正在发出搜索请求。包括搜索查询在内的所有其他内容都添加到查询字符串中,例如;

https://www.google.com/search?q=test

ServiceStack 中的定义为:

[Route("/cars/search")]
public class SearchCars 
{ 
    public List<int> EquipmentIds { get; set; }
    public List<int> ManufacturerIds { get; set; }
    public List<int> ColourIds { get; set; }
}

或者可以很容易地 auto implemented in AutoQuery 使用:

[Route("/cars/search")]
public class SearchCars : QueryDb<Car> 
{ 
    public List<int> EquipmentIds { get; set; }
    public List<int> ManufacturerIds { get; set; }
    public List<int> ColourIds { get; set; }
}