Какой метод HTTP использовать для создания REST API для выполнения следующей операции?

#rest #architecture

Вопрос:

Я ищу REST API для выполнения следующих действий

  1. Поиск на основе отправленных параметров, если результаты найдены, верните результаты.
  2. Если результаты не найдены, создайте запись на основе отправленных параметров поиска.

Может ли это быть достигнуто путем создания одного единственного API или требуются 2 отдельных API?

Ответ №1:

Я бы ожидал, что это будет обработано одним запросом к одному ресурсу.

Какой метод HTTP использовать

Это зависит от семантики происходящего — мы заботимся о том, что означают сообщения, а не о том, как реализованы обработчики сообщений.

Ключевая идея заключается в едином интерфейсе, ограничивающем его; поскольку у нас есть общее понимание того, что означают методы HTTP, соединители общего назначения в приложении HTTP могут выполнять полезную работу (например, возвращать кэшированные ответы на запрос без пересылки их на исходный сервер).

Таким образом, при попытке выбрать подходящий метод HTTP мы можем учитывать последствия этого выбора для компонентов общего назначения (таких как веб-кэш, браузеры, сканеры и так далее).

GET объявляет, что значение запроса фактически доступно только для чтения; из-за этого компоненты общего назначения знают, что они могут отправить этот запрос в любое время (например, агент пользователя может отправить запрос GET до того, как пользователь решит перейти по ссылке, чтобы ускорить процесс).

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

С другой стороны, если клиент пытается отредактировать результаты определенного поиска (но иногда серверу не нужно ничего менять), то GET не подходит, и вам следует использовать POST.

Чтобы понять разницу, нужно подумать о том, какие действия вы хотите предпринять, когда промежуточный кэш содержит ответ от более ранней копии «того же» запроса. Если вы хотите, чтобы кэш повторно использовал ответ, лучше всего использовать GET; с другой стороны, если вы хотите, чтобы кэш выбросил старый ответ (и, возможно, сохранил новый), вам следует использовать POST.