В чем разница между POST и HTTP-ЗАПРОСОМ PUT?
Вопрос
Похоже, что они оба отправляют данные на сервер внутри тела, так что же их отличает?
Решение
HTTP-ПУТ:
PUT помещает файл или ресурс по определенному URI и именно по этому URI.Если по этому URI уже существует файл или ресурс, PUT заменяет этот файл или ресурс.Если там нет файла или ресурса, PUT создает его.PUT — это идемпотент, но, как это ни парадоксально, ответы PUT не кэшируются.
Местоположение HTTP 1.1 RFC для PUT
HTTP-ПОСТ:
POST отправляет данные по определенному URI и ожидает, что ресурс по этому URI обработает запрос.Веб-сервер на этом этапе может определить, что делать с данными в контексте указанного ресурса.Метод POST не идемпотент, однако ответы POST являются кэшируемый, если сервер устанавливает соответствующие заголовки Cache-Control и Expires.
Официальный HTTP RFC определяет POST как:
- Аннотация существующих ресурсов;
- Публикует сообщение в доску объявлений, группу новостей, список рассылки или аналогичную группу статей;
- Предоставление блока данных, таких как результат отправки формы, в процесс обработки данных;
- Расширение базы данных посредством операции добавления.
Расположение HTTP 1.1 RFC для POST
Разница между POST и PUT:
Сам RFC объясняет основное различие:
Основное различие между запросами Post и POT отражается в различном значении запроса-URI.URI в почтовом запросе идентифицирует ресурс, который будет обрабатывать закрытую сущность.Этот ресурс может быть процессом приобретения данных, шлюзом для какого-либо другого протокола или отдельной сущностью, которая принимает аннотации.Напротив, URI в запросе POT идентифицирует объект, заключенный с запросом - пользовательский агент знает, что предназначено URI, и сервер не должен пытаться применить запрос на какой -либо другой ресурс.Если сервер желает, чтобы запрос был применен к другому URI, он должен отправить 301 (перемещенный навсегда) ответ;Агент пользователя может затем принять собственное решение относительно того, перенаправить запрос или нет.
Использование правильного метода, не связанного с этим:
Одно из преимуществ ОСТАЛЬНАЯ РОА vs SOAP заключается в том, что при использовании HTTP REST ROA поощряется правильное использование HTTP-глаголов/методов.Например, вы можете использовать PUT только тогда, когда хотите создать ресурс именно в этом месте.И вы никогда не будете использовать GET для создания или изменения ресурса.
Другие советы
Только семантика.
HTTP PUT
предполагается принять тело запроса, а затем сохранить его на ресурсе, указанном в URI.
HTTP POST
является более общим.Предполагается, что он инициирует действие на сервере.Это действие может заключаться в сохранении тела запроса в ресурсе, указанном в URI, или в другом URI, или в другом действии.
PUT — это нравиться загрузка файла.Добавление к URI влияет именно на этот URI.POST к URI может иметь вообще какой-либо эффект.
Чтобы привести примеры ресурсов в стиле REST:
«POST /books» с набором информации о книге может создать новую книгу и ответить новым URL-адресом, идентифицирующим эту книгу:"/книги/5".
«PUT /books/5» должен будет либо создать новую книгу с идентификатором 5, либо заменить существующую книгу с идентификатором 5.
В нересурсном стиле POST можно использовать практически для всего, что имеет побочный эффект.Еще одно отличие состоит в том, что PUT должен быть идемпотентным - несколько PUT одних и тех же данных для одного и того же URL-адреса должны быть в порядке, тогда как несколько POST могут создавать несколько объектов или что-то еще, что делает ваше действие POST.
PUT подразумевается как метод «загрузки» данных в определенный URI или перезаписи того, что уже находится в этом URI.
POST, с другой стороны, — это способ отправки данных, СВЯЗАННЫХ с данным URI.
Ссылаться на HTTP RFC
Насколько я знаю, PUT в основном используется для обновления записей.
POST — для создания документа или любого другого ресурса.
PUT — обновить созданный документ или любой другой ресурс.
Но чтобы внести ясность, PUT обычно «заменяет» существующую запись, если она есть, и создает, если ее там нет.
Другие уже опубликовали отличные ответы, я просто хотел добавить, что с большинством языков, фреймворков и вариантов использования вы будете иметь дело с POST гораздо чаще, чем с PUT.До момента, когда PUT, DELETE и т.д.по сути, это пустяковые вопросы.
- ПОЛУЧАТЬ:Получает данные с сервера.Другого эффекта быть не должно.
- ПОЧТА:Отправляет данные на сервер для создания новой сущности.Часто используется при загрузке файла или отправке веб-формы.
- ПОМЕЩАТЬ:Похож на POST, но используется для замены существующего объекта.
- ПЛАСТЫРЬ:Аналогично PUT, но используется для обновления только определенных полей в существующей сущности.
- УДАЛИТЬ:Удаляет данные с сервера.
- СЛЕД:Предоставляет способ проверить, что получает сервер.Он просто возвращает то, что было отправлено.
- ПАРАМЕТРЫ:Позволяет клиенту получать информацию о методах запроса, поддерживаемых службой.Соответствующий заголовок ответа — Разрешить с поддерживаемыми методами.Также используется в CORS в качестве предполетного запроса для информирования сервера о фактическом методе запроса и запроса настраиваемых заголовков.
- ГОЛОВА:Возвращает только заголовки ответов.
- СОЕДИНЯТЬ:Используется браузером, когда он знает, что общается с прокси-сервером, и окончательный URI начинается с https://.Целью CONNECT является разрешение сеанса TLS со сквозным шифрованием, поэтому данные не могут быть прочитаны прокси-сервером.
POST считается чем-то вроде метода фабричного типа.Вы включаете в него данные, чтобы создать то, что хотите, и все, что находится на другом конце, знает, что с этим делать.PUT используется для обновления существующих данных по заданному URL-адресу или для создания чего-то нового, когда вы знаете, каким будет URI, но он еще не существует (в отличие от POST, который создает что-то и возвращает URL-адрес это при необходимости).
Пожалуйста, посмотри: http://zacharyvoase.com/2009/07/03/http-post-put-diff/
В последнее время меня очень раздражает популярное заблуждение веб-разработчиков о том, что POST используется для создания ресурса, а PUT — для его обновления/изменения.
Если вы посмотрите на страницу 55 RFC 2616 («Протокол передачи гипертекста — HTTP/1.1»), Раздел 9.6 («PUT»), вы увидите, для чего на самом деле нужен PUT:
Метод PUT запрашивает сохранение вложенного объекта под предоставленным Request-URI.
Также есть удобный абзац, объясняющий разницу между POST и PUT:
Фундаментальное различие между запросами POST и PUT отражено в разном значении Request-URI.URI в запросе POST идентифицирует ресурс, который будет обрабатывать вложенный объект.Этот ресурс может быть процессом приема данных, шлюзом к какому-либо другому протоколу или отдельным объектом, принимающим аннотации.Напротив, URI в запросе PUT идентифицирует объект, включенный в запрос: пользовательский агент знает, какой URI предназначен, и сервер НЕ ДОЛЖЕН пытаться применить запрос к какому-либо другому ресурсу.
Там ничего не говорится о разнице между обновлением/созданием, потому что речь идет не об этом.Речь идет о разнице между этим:
obj.set_attribute(value) # A POST request.
И это:
obj.attribute = value # A PUT request.
Поэтому, пожалуйста, прекратите распространение этого популярного заблуждения.Прочтите свои RFC.
REST просит разработчиков использовать методы HTTP явно и таким образом, чтобы это соответствовало определению протокола.Этот основной принцип дизайна отдыха устанавливает картирование один на один между операциями создания, чтения, обновления и удаления (CRUD) и методами HTTP.В соответствии с этим отображением:
• Чтобы создать ресурс на сервере, используйте POST.
• Чтобы получить ресурс, используйте GET.
• Чтобы изменить состояние ресурса или обновить его, используйте PUT.
• Чтобы удалить или удалить ресурс, используйте DELETE.
Больше информации:Веб-сервисы RESTful:Основы от IBM
Разница между POST и PUT заключается в том, что PUT идемпотентен, то есть вызов одного и того же запроса PUT несколько раз всегда будет давать один и тот же результат (это не является побочным эффектом), в то время как, с другой стороны, повторный вызов запроса POST может иметь ( дополнительные) побочные эффекты создания одного и того же ресурса несколько раз.
GET
:Запросы с использованием GET только извлекают данные, то есть запрашивают представление указанного ресурса.
POST
:Он отправляет данные на сервер для создания ресурса.Тип тела запроса указывается заголовком Content-Type.Это часто вызывает изменение состояния или побочные эффекты на сервере.
PUT
:Создает новый ресурс или заменяет представление целевого ресурса полезными данными запроса.
PATCH
:Он используется для применения частичных изменений к ресурсу.
DELETE
:Удаляет указанный ресурс
TRACE
:Он выполняет проверку обратной связи сообщения на пути к целевому ресурсу, предоставляя полезный механизм отладки.
OPTIONS
:Он используется для описания параметров связи для целевого ресурса. Клиент может указать URL-адрес метода OPTIONS или звездочку (*) для ссылки на весь сервер.
HEAD
:Он запрашивает ответ, идентичный ответу на запрос GET, но без тела ответа.
CONNECT
:Он устанавливает туннель к серверу, указанному целевым ресурсом, может использоваться для доступа к веб-сайтам, использующим SSL (HTTPS).
стоило бы упомянуть, что POST
подчиняется некоторым общим CSRF-атаки пока PUT
нет.
CSRF ниже: невозможно с PUT
когда жертва посещает Attackersite.com:
Обычный запрос (cookies отправляются):(PUT
не является поддерживаемым значением атрибута)
<form id="myform" method="post" action="http://target.site.com/deleteUser" >
<input type="hidden" name="userId" value="5">
</form>
<script>document.createElement('form').submit.call(document.getElementById('myform'));</script>
XHR-запрос (куки-файлы отправляются):(PUT
вызовет предполетный запрос)
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);
Просто
POST
используется для создания ресурса и возвращает ресурс URI
БЫВШИЙ
REQUEST : POST ..../books
{
"book":"booName",
"author":"authorName"
}
Этот вызов должен создать новую книгу и вернуть эту книгу. URI
Response ..../books/5
PUT
используется для замены ресурса, если этот ресурс существует, просто обновите его, но если этот ресурс не существует, создайте его,
REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}
с использованием PUT
мы предоставим идентификатор ресурса, но POST
вернет новый идентификатор ресурса