Передача сложных параметров в запрос GET
У меня есть [HttpGet]
метод веб-API называется GetCats()
который возвращает коллекцию Cat
объекты.
Я добавил параметры skip
а также take
разрешить нумерацию страниц.
Однако требования возросли, и теперь должна быть возможность сложной фильтрации, в случае набора фильтров в формате "PropertyName", "Value", "Type"
например. "CatName", "Mittens", "EqualTo"
и сортировать фильтры по формату "PropertyName", "Direction"
например "CatAge", "Descending"
,
Пропустить и взять также требуется.
Когда этот объект фильтра создается, он может быть довольно большим и сложным. В результате, кажется, уже нецелесообразно помещать его в QueryString, особенно если есть несколько фильтров, так как вам нужен способ сгруппировать их вместе.
Я ищу решение - я думаю, что я мог бы использовать [HttpPost]
и просто опубликовать фильтр, но он кажется неправильным для метода HTTP. Я не уверен, смогу ли я как-то закодировать объект в строку запроса и изящно декодировать его или нет.
Кто-нибудь может предложить исправить это? Я подозреваю, что это обычная проблема - передавать сложные параметры в GET для получения коллекции данных.
2 ответа
Я думаю, что вы можете придерживаться обычного параметра запроса для большинства практических случаев запроса.
Предел строки запроса по умолчанию составляет 2048 в IIS. Это довольно долго для 40-100 отдельных параметров строки запроса по умолчанию, больше, если вы держите имена короткими. Вы также можете увеличить его по мере необходимости - IIS Request Limits.
Если параметры достаточно сложны, вы можете преобразовать их в JSON и в качестве одного параметра запроса.
Если у вас нет идеологических возражений (например, "должен быть интерфейс REST") или технических причин (например, вам нужно кэширование, а ваша CDN не позволяет кэшировать POST-запросы), нет ничего плохого в публикации ваших параметров. Или, если вы хотите придерживаться GET, вы можете поместить больше параметров в заголовки (но это кажется очень хакерским и не приносит вам большой выгоды).
Способ сделать это для запросов GET - строка запроса.
Как вы уже упоминали, для запросов POST данные могут быть переданы в теле.
Неортодоксальным методом было бы использовать HTTP-заголовки и отправлять некоторую информацию таким образом, но это может не сработать с некоторыми пуристами!! И это также может быть связано с некоторыми сетями.
Вам нужно найти баланс между тем, что работает, и тем, что приемлемо в вашем дизайне.