使用ServiceStack API中的多个输入获取请求

时间:2019-04-09 17:52:11

标签: servicestack

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

geode-old-versions

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

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

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

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

Multiple Optional Parameters with ServiceStack.Net

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

1 个答案:

答案 0 :(得分:2)

URL应该是“资源标识符”,其中任何查询字符串参数都是对该资源请求的修饰符。

因此,您不应在/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; }
}