Как бы вы делали поиск в rest?

Всё что касается построения API
Ответить
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Как бы вы делали поиск в rest?

Сообщение maleks »

Приветствую.

Оттолкнемся от документации:
Вот так просто мы и создали RESTful API для доступа к данным пользователя. API нашего сервиса сейчас включает в себя:
GET /users: получение постранично списка всех пользователей;
Фильтрация коллекций как http://localhost/users?filter[id]=10 или http://localhost/users?filter[email][like]=gmail.com возможна при использовании фильтров данных
Но если мне поставили задачу сделать через rest именно Поиск, заготовка выше наверное не подходит, она все записи показывает, если ничего не фильтруется.
У меня же логика другая:
- условие должно присутствовать
- выдавать только то, что соответствует условию

Погуглил на тему и смотрю подходы разнятся.
Кто то советует сам поиск сделать как ресурс, и с POST запросом "создавать" новый поиск.
Насколько это правильно, ведь в теории POST метод
Idempotent - no
Safe -no

, а в этом поиске будет по сути
Idempotent - yes
Safe -yes

Может лучше какой нибудь
GET /users/search?
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как бы вы делали поиск в rest?

Сообщение ElisDN »

maleks писал(а): 2022.01.28, 15:47 Может лучше какой нибудь
GET /users/search?
Да, лучше для каждой отдельной задачи делать отдельный адрес.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Как бы вы делали поиск в rest?

Сообщение maleks »

А если мне задачу поставили так - "находить пользователя по емейлу".
А потом, как окажется, находить по чему то еще и еще.
В один все совать получается не логично, т.к. в каждом должно потребовать обязательного ввода поисковых данных.

Тоже , может , это в адресе отразить?

Код: Выделить всё

GET /users/search-by-phone
или
GET /users/search/by-phone
, какой лучше?

А по ответам как делать?
Когда email корректен и нашли пользователя, вернем его

Код: Выделить всё

{
  id: 4545
  fio:
}
, когда не указан email или он неверный, то вернем

Код: Выделить всё

{
  status: 'error',
  errorMessage: '....'
}
, а когда ошибки нет, но пользователь не найден, то просто

Код: Выделить всё

{
  status: 'user not found'
}
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как бы вы делали поиск в rest?

Сообщение samdark »

Самый лучший способо удовлетворить сразу любые запросы клиента — дать ему GraphQL вместо REST. Но это дороже и обычно не нужно.

GET /users/search?email=x&banned=0
Ответить