我正在创建一个接受多个参数的端点。我想知道在ServiceStack中执行此操作的正确方法是什么,因为我知道可以这样定义路由:
geode-old-versions
但这并不意味着必须在ManufacturerIds和ColourIds之前定义EquipmentIds,否则API会错误地解释它?
我想指定我使用的参数,然后在不使用其余参数时不包括其他参数。
一个不干净的url看起来像这样吗?EquipmentIds = 1&ColourIds = 1
我找到了以下解决方案,但这是2011年的解决方案
Multiple Optional Parameters with ServiceStack.Net。
是否有一个新的解决方案,或者这仍然是正确的处理方式?
答案 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; }
}