Вопрос

Похоже, что они оба отправляют данные на сервер внутри тела, так что же их отличает?

Это было полезно?

Решение

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 в основном используется для обновления записей.

  1. POST — для создания документа или любого другого ресурса.

  2. PUT — обновить созданный документ или любой другой ресурс.

Но чтобы внести ясность, PUT обычно «заменяет» существующую запись, если она есть, и создает, если ее там нет.

Другие уже опубликовали отличные ответы, я просто хотел добавить, что с большинством языков, фреймворков и вариантов использования вы будете иметь дело с POST гораздо чаще, чем с PUT.До момента, когда PUT, DELETE и т.д.по сути, это пустяковые вопросы.

  1. ПОЛУЧАТЬ:Получает данные с сервера.Другого эффекта быть не должно.
  2. ПОЧТА:Отправляет данные на сервер для создания новой сущности.Часто используется при загрузке файла или отправке веб-формы.
  3. ПОМЕЩАТЬ:Похож на POST, но используется для замены существующего объекта.
  4. ПЛАСТЫРЬ:Аналогично PUT, но используется для обновления только определенных полей в существующей сущности.
  5. УДАЛИТЬ:Удаляет данные с сервера.
  6. СЛЕД:Предоставляет способ проверить, что получает сервер.Он просто возвращает то, что было отправлено.
  7. ПАРАМЕТРЫ:Позволяет клиенту получать информацию о методах запроса, поддерживаемых службой.Соответствующий заголовок ответа — Разрешить с поддерживаемыми методами.Также используется в CORS в качестве предполетного запроса для информирования сервера о фактическом методе запроса и запроса настраиваемых заголовков.
  8. ГОЛОВА:Возвращает только заголовки ответов.
  9. СОЕДИНЯТЬ:Используется браузером, когда он знает, что общается с прокси-сервером, и окончательный 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 вернет новый идентификатор ресурса

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top