Я создаю конечную точку, которая принимает несколько параметров. Мне было интересно, как правильно это сделать в ServiceStack, поскольку я знаю, что маршруты можно определить следующим образом:
[Route("/Cars/{EquipmentIds}/{ManufacturerIds}/{ColourIds}")]
Но не означает ли это, что EquipmentIds должны быть определены раньше, чем ManufacturerIds и ColourIds, иначе API интерпретирует их неправильно?
Я хотел бы указать параметры, которые я использую, а затем не включать остальные, когда они не используются.
Тогда нечистый URL будет выглядеть так: ?EquipmentIds=1&ColourIds=1
Я нашел следующее решение, но это было от 2011 года.
Несколько необязательных параметров с ServiceStack.Net.
Есть ли новое решение для этого, или это все еще правильный способ ведения дел?
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; }
}
@AtleKristiansen Все аргументы QueryString являются необязательными, они просто не будут заполняться в DTO запроса.
Когда я набираю /cars/search, я получаю NullReferenceException, потому что я использую DTO в QueryDb?
@AtleKristiansen Тип должен быть моделью данных OrmLite таблицы, которая существует в вашей СУБД. Пожалуйста, откройте новые вопросы для новых вопросов и включите весь соответствующий исходный код + сведения об ошибке.
Подойдет, да я хоть и так, но сработало, когда я указал параметры.
Означает ли это, что даже если я не использую все параметры (ничего не отфильтровывается), мне придется включить их? Как в вашем примере /cars/search?EquipmentIds=1,2,3&ManufacturerIds=4,5,6&ColourIds=7,8,9