Основная особенность REST, определенная Fielding, это унифицированный интерфейс .
Чтобы иметь унифицированный интерфейс, вам необходимо стандартизировать используемые вами элементы протокола.
Общий стандарт для методов HTTP: RFC 7231 .Он определяет GET
для поиска представлений, которые могут включать «отфильтрованные данные».Он определяет GET
как безопасный и кешируемый .
Представьте, что вы пишете универсальный клиент RESTful .Вы можете предположить, что GET
будет получать представление запрошенного URL.Вы можете кэшировать ответы на GET
.Вы можете повторить GET
запросов на ошибки (потому что это безопасно).Это все очень полезно.
Но POST
определяется как универсальный, универсальный метод.Мало того, что ему не хватает какой-либо собственной семантики, но RFC 7231 говорит (выделение мое):
Метод POST запрашивает, чтобы целевой ресурс обработал представление, заключенное в запросе , в соответствии сСобственная специфическая семантика ресурса .
Таким образом, в вашем универсальном клиенте RESTful вы ничего не можете предположить о POST
, поэтому вы не можете ничего с ним поделать.
То есть GET
является частью единого интерфейса, а POST
- нет.В этом смысле GET
является «более RESTful».
Тем не менее, вы можете разработать новый стандарт для POST
запросов, например, с Content-Type: application/data-filter
, с полезной и четко определенной семантикой.Это противоречило бы приведенному выше тексту RFC 7231, но как бы то ни было, если у вас будет достаточно людей, чтобы согласиться с вами (возможно, в вашей организации), у вас снова будет единый интерфейс.
Кстати, естьбыла попытка стандартизировать SEARCH
метод для чего-то подобного.Это будет нормально работать как единый интерфейс (в сочетании со стандартизированным Content-Type
).К сожалению, это предложение зашло в тупик, поэтому вам, вероятно, не следует использовать SEARCH
.