Почему использование ПОМЕЩЕННЫЙ HTTP и УДАЛЯЕТ методы вместо POST?

 new_story GET     /story/new(.:format)  {:action=>"new", :controller=>"stories"}
edit_story GET     /story/edit(.:format) {:action=>"edit", :controller=>"stories"}
     story GET     /story(.:format)      {:action=>"show", :controller=>"stories"}
           PUT     /story(.:format)      {:action=>"update", :controller=>"stories"}
           DELETE  /story(.:format)      {:action=>"destroy", :controller=>"stories"}
           POST    /story(.:format)      {:action=>"create", :controller=>"stories"}

В веб-разработке я сделал с другими технологиями, я только когда-либо использовал GET и POST методы, но с RESTful маршруты в направляющих, по умолчанию PUT и DELETE методы используются для update и destroy действия. Каковы преимущество или потребность в использовании PUT и DELETE? Я предполагаю, что эти методы являются просто другим способом сделать POST - но почему не просто придерживаются с POST?

28
задан Johnny Bones 17 July 2019 в 13:24
поделиться

3 ответа

Преимущество в основном семантическое, а также может до некоторой степени упростить URL-адреса. Различные методы HTTP соответствуют различным действиям:

POST   => create a new object
DELETE => delete an object
PUT    => modify an object
GET    => view an object

Теоретически вы можете использовать тот же URL-адрес, но взаимодействовать с ним, используя разные методы; метод, используемый для доступа к ресурсу, определяет фактический тип операции.

Однако на практике большинство браузеров поддерживают только HTTP GET и POST. Rails использует некоторые «уловки» в формах HTML, чтобы действовать так, как если бы был отправлен запрос PUT или DELETE, даже если Rails все еще использует GET или POST для этих методов. (Это объясняет, почему вы, возможно, не использовали DELETE или PUT на других платформах.)

56
ответ дан 28 November 2019 в 02:36
поделиться

Это было бы похоже на вопрос, зачем «удалять» файл, если вы можете просто установить его содержимое на ноль байтов, и файловая система будет рассматривать это как удаление. HTTP всегда поддерживал глаголы, отличные от GET / POST, но способ развития SOAP как бы исказил исходное значение этих глаголов. REST - это более простой подход, основанный на принципах возврата к основам, который использует глаголы в том виде, в каком они были задуманы, вместо того, чтобы изобретать новую концепцию глаголов внутри полезной нагрузки.

8
ответ дан 28 November 2019 в 02:36
поделиться

Вот раздел "методы" спецификации HTTP 1.1 ; он определяет множество методов, и все они имеют разные преимущества и недостатки. POST является наиболее гибким, но у него много компромиссов: он не кэшируется (поэтому остальная часть Интернета не может помочь вам в масштабировании), он небезопасен или идемпотентен, поэтому клиент не может просто повторно отправить, он получает ошибку, и больше не ясно, что именно вы пытаетесь выполнить (потому что он настолько гибкий). Я уверен, что есть и другие, но этого должно быть достаточно. Учитывая все это, если спецификация HTTP определяет метод, который делает именно то, что вы хотите, чтобы ваш запрос выполнял, нет причин отправлять вместо этого POST .

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

Кстати, отображение, которое предоставил @mipadi, является стандартным, но не единственным допустимым. Amazon S3, например, использует PUT для создания ресурсов. Единственная причина использовать POST - это если у клиента недостаточно знаний для создания ресурса, например, вы поддерживаете свои ресурсы с помощью реляционной базы данных и используете искусственные суррогатные ключи.

Поскольку GET определен как безопасный и идемпотентный (хотя многие приложения этого не придерживаются), единственным безопасным способом изменения данных была отправка POST . С появлением AJAX и клиентов, не являющихся браузерами, это больше не так.

Кстати, отображение, которое предоставил @mipadi, является стандартным, но не единственным допустимым. Amazon S3, например, использует PUT для создания ресурсов. Единственная причина использовать POST - это если у клиента недостаточно знаний для создания ресурса, например, вы поддерживаете свои ресурсы с помощью реляционной базы данных и используете искусственные суррогатные ключи.

Поскольку GET определен как безопасный и идемпотентный (хотя многие приложения этого не придерживаются), единственным безопасным способом изменения данных была отправка POST . С появлением AJAX и клиентов, не являющихся браузерами, это больше не так.

Кстати, отображение, которое предоставил @mipadi, является стандартным, но не единственным допустимым. Amazon S3, например, использует PUT для создания ресурсов. Единственная причина использовать POST - это если у клиента недостаточно знаний для создания ресурса, например, вы поддерживаете свои ресурсы с помощью реляционной базы данных и используете искусственные суррогатные ключи.

С появлением AJAX и клиентов, не являющихся браузерами, это больше не так.

Кстати, отображение, которое предоставил @mipadi, является стандартным, но не единственным допустимым. Amazon S3, например, использует PUT для создания ресурсов. Единственная причина использовать POST - это если у клиента недостаточно знаний для создания ресурса, например, вы поддерживаете свои ресурсы с помощью реляционной базы данных и используете искусственные суррогатные ключи.

С появлением AJAX и клиентов, не являющихся браузерами, это больше не так.

Кстати, отображение, которое предоставил @mipadi, является стандартным, но не единственным допустимым. Amazon S3, например, использует PUT для создания ресурсов. Единственная причина использовать POST - это если у клиента недостаточно знаний для создания ресурса, например, вы поддерживаете свои ресурсы с помощью реляционной базы данных и используете искусственные суррогатные ключи.

9
ответ дан 28 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: