Передача сложных параметров в запрос 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-заголовки и отправлять некоторую информацию таким образом, но это может не сработать с некоторыми пуристами!! И это также может быть связано с некоторыми сетями.

Вам нужно найти баланс между тем, что работает, и тем, что приемлемо в вашем дизайне.

Другие вопросы по тегам