Следует ли использовать POST только для API-интерфейсов создания типов на сервере RESTful? - PullRequest
0 голосов
/ 12 мая 2018

Должен ли сервер RESTful (или любой другой) использовать только POST-маршруты для создания данных?Например, если бы я сказал, что мне нужно получить отфильтрованные данные с нашего сервера, некоторые люди предложили бы поместить эти условия в тело маршрута POST.

Однако некоторые разработчики также предлагают поместить эти условия в маршрут GET и использовать либо параметры URL, либо URL-запросы для извлечения данных.Те же разработчики на последней стороне также сказали бы мне, что всякий раз, когда вызывается POST-маршрут, что-то должно быть создано, например, в базе данных.

Мне кажется, что было бы лучше использоватьGET для запросов, чтобы сохранить его RESTful.Я хотел бы знать, насколько важно не допустить POST-маршрутов из базовых запросов и почему?(если это вообще важно)

1 Ответ

0 голосов
/ 12 мая 2018

Основная особенность 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.

...