Следуя принципам REST, я бы хотел создать метод GET для моего API, который выполняет поиск по некоторым критериям и возвращает результаты клиенту. Проблема в том, что критерии могут иметь до 14 параметров, один из которых - список сложных объектов, поэтому ...
Я даже не знаю, возможно ли кодировать / декодировать эти сложные объекты в / из параметров URL.
Я не рассчитывал, как долго может получиться URL, но я уверен, что он будет достаточно большим и, возможно, достигнет предела длины URL?
Кроме того, поиск должен показывать результаты в «реальном времени», я имею в виду, что каждый раз, когда пользователь что-то меняет в форме поиска, он должен видеть новые результаты, не нажимая кнопку «поиск».
Не могли бы вы уточнить мне эти моменты и что бы вы посоветовали для создания спокойного метода поиска с большим количеством параметров?
search?q=t
,search?q=te
,search?q=test
и так далее. Попробуйте ограничить частоту отправки запроса, чтобы не повредить вашему серверу. В качестве альтернативы вы также можете вернуть много информации и выполнить фильтрацию на стороне клиента. Это хорошо работает, если пользователь вводит широкие категории, которые могут сильно сузить круг.Ответы:
Прежде чем читать мой ответ, я хотел бы сказать, что я согласен с @Neil. Мы должны выбрать наши сражения. Мы обычно хотим сделать все возможное, но иногда для обсуждения недостаточно места, и нам приходится принимать решения против нашей воли.
В любом случае, в ответе Нила я скучаю по еще одной вещи. Документация . Просто чтобы убедиться, что разработчики знают, что запросы POST
/search
безопасны.Это сказал.
1. Дайте шанс ПОЛУЧИТЬ
Рассмотрим
GET
вариант в первую очередь. Проверьте максимальную длину URL этого вопроса . Оцените, превышает ли ваша самая длинная строка запроса более 2000 символов. Если это не так, и вы не ожидаете, что будет, пойти сGET
. Это может показаться некрасивым, но, по крайней мере, вы можете добавить в закладки URL-адрес и, конечно, он обладает всеми преимуществами, вытекающими из семантики метода (идемпотентность, безопасность и кэширование)1.1 Попробуйте кодировать строку запроса
Например, в базе 64. Даже javascript поддерживает кодировки базы 64 .
Вот как это работает:
/search?q=SGVsbG8gV29ybGQh....
).Ранее сделайте максимально длинную строку JSON, закодируйте ее и возьмите длину. Оцените, соответствует ли закодированная строка URL-адресу. Я реализовал следующий фрагмент на Fiddle.js для тестирования. (Я надеюсь, что это все еще работает) 1
Кодирование Base 64 является детерминированным и обратимым, поэтому шансов на столкновение нет.
С помощью закодированных запросов мы также можем сохранять результаты поиска в БД, добавлять закладки в URL, обмениваться ссылками и т. Д. И, конечно, нам не нужно экранировать / удалять строку.
1.2 Попробуйте с псевдонимами
Читая этот блог о том, как создавать REST API, я вспомнил еще одну альтернативу. Псевдонимы для общих запросов .
Я нахожу это интересным по следующим причинам
Сократите длину строки запроса. Это делает API чище и удобнее для пользователя
ПОЛУЧИТЬ / тикеты /? Статус = закрыто и закрытоAt = xxx против GET / тикеты / недавно закрыто /
Комбинируется с большим количеством псевдонимов или большим количеством параметров запроса.
ПОЛУЧИТЬ / билеты /? Статус = закрыто и закрытоAt = xxx & в течение = 30 минут против ПОЛУЧИТЬ / билеты / недавно закрытое /? В течение = 30 минут
Мы можем комбинировать псевдонимы с закодированными строками запроса
ПОЛУЧИТЬ / тикеты /? Статус = закрыто & закрытоAt = xxx & в течение = 30 минут против GET / тикеты / недавно закрыто /? Q = SGVsbG8g ...
1: Я использовал JSON, но мы могли бы использовать другие форматы, как только мы сможем десериализовать его на стороне сервера.
источник
Если у вас есть только молоток, все выглядит как гвоздь. Кажется, проблема в том, что вы пытаетесь превратить поисковую страницу в RESTful, и вряд ли это является общим шаблоном, который решает дизайн RESTful.
Просто отправьте запрос POST с параметрами, предоставленными пользователем, чтобы получить необходимую информацию из серверной части. Я предполагаю, что вам не нужно ничего делать, кроме как выполнять поиск, поэтому у вас нет шансов вставить эту страницу. Просто добавьте / search в конец вашего URL, чтобы не рисковать столкнуться с вашей страницей / users, которая была бы RESTful.
источник
Это полностью зависит от того, какая у вас модель API: ни как, ни как глагол.
Если API отсутствует, вы можете получить список объектов следующим образом:
В этом случае вы должны отправить данные в качестве параметров запроса. Таким образом, вы должны описать свои параметры в виде простого списка значений ключей:
Некоторые платформы поддерживают собственный преобразователь параметров (например, Spring MVC), и вы можете конвертировать параметры в объект.
источник