Помните, что с REST API все зависит от вашей точки зрения.
Двумя ключевыми понятиями в REST API являются конечные точки и ресурсы (сущности). Проще говоря, конечная точка либо возвращает ресурсы через GET, либо принимает ресурсы через POST и PUT и т. Д. (Или комбинацию вышеперечисленного).
Принято считать, что с помощью POST отправляемые вами данные могут или не могут привести к созданию нового ресурса и связанных с ним конечных точек, которые, скорее всего, не будут «жить» под URL-адресом POST. Другими словами, когда вы отправляете POST, вы отправляете данные куда-то для обработки. Конечная точка POST находится не там, где обычно может быть найден ресурс.
Цитата из RFC 2616 (с опущенными нерелевантными частями и выделенными соответствующими частями):
9,5 ПОСТ
Метод POST используется для запроса, чтобы исходный сервер принял объект, включенный в запрос, в качестве нового подчиненного ресурса, идентифицируемого Request-URI в строке запроса. POST разработан для того, чтобы унифицированный метод мог выполнять следующие функции:
- ...
- Предоставление блока данных, такого как результат отправки формы, процессу обработки данных;
- ...
...
Действие, выполняемое методом POST, может не привести к ресурсу, который может быть идентифицирован по URI . В этом случае либо 200 (ОК), либо 204 (Нет содержимого) является подходящим статусом ответа, в зависимости от того, включает ли ответ объект, который описывает результат .
Если ресурс был создан на исходном сервере, ответ ДОЛЖЕН быть 201 (Создан) ...
Мы привыкли к конечным точкам и ресурсам, представляющим «вещи» или «данные», будь то пользователь, сообщение, книга - все, что диктует проблемная область. Однако конечная точка также может предоставлять другой ресурс - например, результаты поиска.
Рассмотрим следующий пример:
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
Это типичный REST CRUD. Однако что если мы добавим:
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
В этой конечной точке нет ничего плохого. Он принимает данные (сущность) в виде тела запроса. Эти данные являются критериями поиска - DTO, как и любой другой. Эта конечная точка создает ресурс (сущность) в ответ на запрос: Результаты поиска . Ресурс результатов поиска является временным ресурсом, который незамедлительно предоставляется клиенту, без перенаправления и без предоставления какого-либо другого канонического URL.
Это все еще REST, за исключением того, что сущности не являются книгами - сущность запроса - это критерии поиска книг, а сущность ответа - результаты поиска книг.