Получить запрос с несколькими входами в ServiceStack API - PullRequest
1 голос
/ 09 апреля 2019

Я создаю конечную точку, которая принимает несколько параметров.Мне было интересно, как правильно сделать это в ServiceStack, так как я знаю, что маршруты могут быть определены следующим образом:

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

Но не значит ли это, что EquipmentIds должны быть определены до ManufacturerIds и ColourIdsиначе API будет интерпретировать это неправильно?

Я хотел бы указать параметры, которые я использую, а затем не включать остальные, когда они не используются.

Нечистый URL-адрес будет выглядеть следующим образом? EquipmentIds = 1 & ColourIds = 1

Я нашел следующее решение, но это было из 2011

Несколько необязательных параметровс ServiceStack.Net .

Есть ли новое решение для этого или это все еще правильный способ ведения дел?

1 Ответ

2 голосов
/ 09 апреля 2019

URL должен быть «идентификатором ресурса», где любые аргументы строки запроса являются модификаторами этого запроса ресурса.

Таким образом, вы не должны помещать сложные типы в /path/info, которые вряд ли станут частью идентификатора ресурса для этого маршрута.

Ваш маршрут должен содержать самоописание того, для чего он является идентификатором ресурса. Заполнение анонимной группы идентификаторов в URL не делает его чистым 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; }
}

Или это может быть легко автоматически реализовано в 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; }
}
...