Когда использовать модели в качестве параметров над параметрами URL в API C # - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть метод внутри контроллера, который возвращает список объектов.Реализация контроллера не важна.Метод называется GetAllTestsByLocationIdAndPollTypeId и возвращает список объектов «Тест».GET принимает 4 параметра: locationId, pollTypeId, itemsToLoad и строку до search by.Я ищу, чтобы добавить больше параметров и чувствую, что передача в 6 объектов в URL немного.Сигнатура метода выглядит следующим образом:

[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")

Должен ли я передать модель, которая содержит значения, которые я сейчас использую для параметров?

РЕДАКТИРОВАТЬ: я не могу сделать [HttpPost], потому что POST запросы не кэшируются и, следовательно, могут быть дорогими и в этом случае, будут дорогими.

РЕДАКТИРОВАТЬ: я решил фильтры в строке запроса, используя необязательные параметры, чтобы уменьшить количество передаваемых вещей.

1 Ответ

0 голосов
/ 19 сентября 2018

Это полностью зависит от вас, но да, когда параметры увеличиваются и имеют большой размер. Размер заголовка может превышать, поскольку это HttpGet, когда данные отправляются в заголовке в виде параметров строки запроса.

Вы можете попробовать HttpPostпоскольку он отправляет данные в теле, также использует класс и не показывает значения параметров, если данные превышают https:

[HttpPost]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId([FromBody]TestLocation request)

Здесь я предполагаю, что вы можете создать класс TestLocation или любое другое имя, которое вам нравитсяПубличные свойства имени нужного вам параметра.

Теперь вам нужно отправить JSON объект класса после stringify как {'locationId':1, 'pollTypeId':1, 'itemsToLoad':10, 'search': 'your text'} и изменить ajax на post.Так как вы оставили, как вы звоните из ajax, я оставляю это вам

ОБНОВЛЕНИЕ


Согласно обратной связи @PanagiotisKanavos (сообщение не кэшируется) &Если вы знаете, что строка запроса не длинная, вы можете попробовать добавить маршрут, например:

config.Routes.MapHttpRoute("MyRoute", "{controller}/{locationId}/{pollTypeId}/{itemsToLoad}/{search}", new { controller = "Region", action = "GetCountries" })

или Добавить атрибут на уровне контроллера, если маршруты / параметры уникальны для методов действия:

[Route("GetAllTestsByLocationIdAndPollTypeId/{locationId}/{pollTypeId}/{itemsToLoad}/{search}")]
[HttpGet]
public IHttpActionResult GetAllTestsByLocationIdAndPollTypeId(int locationId, int pollTypeId, int itemsToLoad = 8, string search = "")

Теперь ваш вызов API может быть таким: http://localhost/controller/1/2/10/test

ИЛИ

Вы можете попробовать комбинацию маршрута и запроса.например, {LocationId} / {pollType} / Tests? itemsToLoad = N & search = X в соответствии с предложением @ KirkLarkin

...