Какая разница между POST и PUT HTTP REQUEST?

Кажется, что они отправляют данные на сервер внутри тела, поэтому что отличает их?

Ответ 1

HTTP PUT:

PUT помещает файл или ресурс в определенный URI и точно в этот URI. Если в этом URI уже есть файл или ресурс, PUT заменяет этот файл или ресурс. Если там нет файла или ресурса, PUT создает его. PUT idempotent, но парадоксально ответы PUT не кэшируемы.

HTTP 1.1 Местоположение RFC для PUT

HTTP POST:

POST отправляет данные в определенный URI и ожидает, что ресурс в этом URI обрабатывает запрос. Веб-сервер в этот момент может определить, что делать с данными в контексте указанного ресурса. Метод POST не idempotent, однако ответы POST могут быть кэшируемыми, если сервер устанавливает соответствующие заголовки Cache-Control и Expires.

Официальный HTTP RFC определяет POST как:

  • Аннотация существующих ресурсов;
  • Размещение сообщения на доске объявлений, в новостной группе, в списке рассылки,  или аналогичная группа статей;
  • Предоставление блока данных, например, результата отправки   формы, к процессу обработки данных;
  • Расширение базы данных с помощью операции добавления.

HTTP 1.1 Местоположение RFC для POST

Разница между POST и PUT:

Сам RFC объясняет основную разницу:

Основное различие между Запросы POST и PUT отражены в различный смысл Request-URI. URI в запросе POST идентифицирует ресурс, который будет обрабатывать закрытую сущность. Что ресурсом может быть прием данных процесс, шлюз для некоторых других протокол или отдельный объект, который принимает аннотации. Напротив, URI в запросе PUT идентифицирует объект, прилагаемый к запросу - пользовательский агент знает, что такое URI и сервер НЕ ДОЛЖЕН попытка применить запрос к другой ресурс. Если сервер желает что запрос будет применен к другой URI, он ДОЛЖЕН отправить 301 (перемещенный постоянный) ответ; пользовательский агент МОЖЕТ затем сделать его собственное решение относительно того, следует ли перенаправить запрос.

Использование правильного метода, не связанного в стороне:

Одно из преимуществ REST ROA против SOAP заключается в том, что при использовании HTTP REST ROA оно поощряет правильное использование HTTP-глаголов/методов. Например, вы должны использовать PUT только в том случае, если хотите создать ресурс в этом точном месте. И вы никогда не будете использовать GET для создания или изменения ресурса.

Ответ 2

Только семантика.

Предполагается, что HTTP PUT принимает тело запроса, а затем сохраняет его на ресурсе, идентифицированном URI.

HTTP POST является более общим. Предполагается инициировать действие на сервере. Это действие может состоять в том, чтобы сохранить тело запроса в ресурсе, идентифицированном URI, или это может быть другой URI, или это может быть другое действие.

PUT , например. Помещенный в URI влияет именно на этот URI. POST для URI может вообще иметь какой-либо эффект.

Ответ 3

Чтобы привести примеры ресурсов стиля REST:

"POST/books" с кучей информации о книге может создать новую книгу и ответить новым URL-адресом, идентифицирующим эту книгу: "/books/5".

"PUT/books/5" придется либо создать новую книгу с идентификатором 5, либо заменить существующую книгу с идентификатором 5.

В стиле non-resource POST можно использовать практически для всего, что имеет побочный эффект. Еще одно отличие состоит в том, что PUT должен быть идемпотентным - несколько PUT одинаковых данных для одного и того же URL-адреса должны быть точными, если несколько POST могут создавать несколько объектов или что-то, что делает ваше POST-действие.

Ответ 4

PUT понимается как метод "загрузки" материала в определенный URI или перезапись того, что уже находится в этом URI.

POST, с другой стороны, является способом отправки данных, относящихся к данному URI.

Обратитесь к HTTP RFC

Ответ 5

1) GET: - используется, когда клиент запрашивает ресурс на веб-сервере.

2) HEAD: - используется, когда клиент запрашивает некоторую информацию о ресурсе, но не запрашивает сам ресурс.

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

4) PUT: - Используется, когда клиент отправляет заменяющий документ или загружает новый документ на веб-сервер под URL-адресом запроса.

5) DELETE: - Используется, когда клиент пытается удалить документ с веб-сервера, указанный URL-адресом запроса.

6) TRACE: - Используется, когда клиент просит доступные прокси или промежуточные серверы изменять запрос, чтобы объявить себя.

7) ОПЦИИ: - Используется, когда клиент хочет определить другие доступные методы для извлечения или обработки документа на веб-сервере.

8) CONNECT: - Используется, когда клиент хочет установить прозрачное соединение с удаленным хостом, как правило, для обеспечения SSL-шифрованной связи (HTTPS) через прокси-сервер HTTP.

Ответ 6

Насколько я знаю, PUT в основном используется для обновления записей.

  • POST - создание документа или любого другого ресурса

  • PUT - обновление созданного документа или любого другого ресурса.

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

Ответ 7

  1. GET: получает данные с сервера. Не должно иметь никакого другого эффекта.
  2. POST: отправляет данные на сервер для создания нового объекта. Часто используется при загрузке файла или отправке веб-формы.
  3. PUT: похоже на POST, но используется для замены существующего объекта.
  4. PATCH: аналогично PUT, но используется для обновления только определенных полей в существующем объекте.
  5. УДАЛИТЬ: Удаляет данные с сервера.
  6. TRACE: предоставляет способ проверить, что получает сервер. Он просто возвращает то, что было отправлено.
  7. ОПЦИИ: Позволяет клиенту получать информацию о методах запроса, поддерживаемых службой. Соответствующий заголовок ответа - Разрешить с поддерживаемыми методами. Также используется в CORS в качестве предварительного запроса для информирования сервера о фактическом методе запроса и запроса о пользовательских заголовках.
  8. HEAD: возвращает только заголовки ответа.
  9. CONNECT: Используется браузером, когда он знает, что разговаривает с прокси, и окончательный URI начинается с https://. Назначение CONNECT - разрешить сквозной зашифрованный сеанс TLS, чтобы данные не могли быть прочитаны прокси-сервером.

Ответ 8

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

Ответ 9

Согласно RFC, разница между PUT и POST находится в URI запроса. URI, идентифицированный POST, определяет объект, который будет обрабатывать запрос POST. URI в запросе PUT включает объект в запрос. Таким образом, POST /v1/coffees/orders означает создание нового ресурса и возврат идентификатор для описания ресурса. Напротив, PUT /v1/coffees/orders/1234 означает обновление ресурса, идентифицированного "1234", если оно существует; иначе создайте новый порядок и используйте URI orders/1234, чтобы идентифицировать его.

PUT and POST can both be used to create or update methods. The usage of the method depends on the idempotent behavior expected from the method as well as the location of the resource to identify it.

Ответ 10

POST считается чем-то вроде метода типа factory. Вы включаете данные с ним, чтобы создать то, что хотите, и все, что находится на другом конце, знает, что с ним делать. PUT используется для обновления существующих данных по указанному URL-адресу или для создания чего-то нового, когда вы знаете, что будет URI, и он еще не существует (в отличие от POST, который создаст что-то и вернет URL-адрес при необходимости).

Ответ 11

Смотрите: 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.

Theres также удобный абзац, чтобы объяснить разницу между 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.

Ответ 12

REST просит разработчиков использовать методы HTTP явно и таким образом, чтобы это соответствовало определению протокола. Этот базовый принцип проектирования REST устанавливает взаимно-однозначное сопоставление между операциями создания, чтения, обновления и удаления (CRUD) и методами HTTP. Согласно этому отображению:

• Чтобы создать ресурс на сервере, используйте POST.

• Чтобы получить ресурс, используйте GET.

• Чтобы изменить состояние ресурса или обновить его, используйте PUT.

• Чтобы удалить или удалить ресурс, используйте DELETE.

Дополнительная информация: RESTful Web-сервисы: основы от IBM

Ответ 13

Разница между POST и PUT заключается в том, что PUT является идемпотентным, то есть многократный вызов одного и того же запроса PUT всегда будет приводить к одному и тому же результату (что не является побочным эффектом), в то время как, с другой стороны, повторный вызов запроса POST может иметь ( дополнительные) побочные эффекты от создания одного и того же ресурса несколько раз.

GET: запросы, использующие GET, извлекают только данные, то есть запрашивают представление указанного ресурса.

POST: отправляет данные на сервер для создания ресурса. Тип тела запроса указывается заголовком Content-Type. Это часто вызывает изменение состояния или побочные эффекты на сервере

PUT: создает новый ресурс или заменяет представление целевого ресурса на полезную нагрузку запроса

PATCH: используется для частичного изменения ресурса

DELETE: удаляет указанный ресурс

TRACE: выполняет проверку обратной связи по пути к целевому ресурсу, обеспечивая полезный механизм отладки.

OPTIONS: используется для описания параметров связи для целевого ресурса, клиент может указать URL-адрес для метода ОПЦИИ или звездочку (*) для ссылки на весь сервер.

HEAD: запрашивает ответ, идентичный ответу запроса GET, но без тела ответа.

CONNECT: устанавливает туннель для сервера, идентифицируемого целевым ресурсом, может использоваться для доступа к веб-сайтам, использующим SSL (HTTPS).

Ответ 14

Стоит отметить, что POST подвержен некоторым распространенным атакам CSRF, а PUT - нет.

Приведенный ниже CSRF невозможен с PUT когда жертва посещает сайт attackersite.com:

Обычный запрос (куки отправляются): (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"]);

Ответ 15

REST-полное использование

POST используется для создания нового ресурса, а затем возвращает ресурс URI

EX 
      REQUEST : POST ..../books
        {
        "book":"booName",
        "author":"authorName"
        }

Этот вызов может создать новую книгу и вернуть эту книгу URI

Response ...THE-NEW-RESOURCE-URI/books/5

PUT используется для замены ресурса. Если этот ресурс существует, просто обновите его, но если этот ресурс не существует, создайте его,

REQUEST : PUT ..../books/5
{
"book":"booName",
"author":"authorName"
}

С помощью PUT мы знаем идентификатор ресурса, но POST вернет новый идентификатор ресурса

Использование без REST

POST используется для запуска действия на стороне сервера, это действие может создавать или не создавать ресурс, но это действие будет иметь побочные эффекты, всегда что-то меняет на сервере

PUT используется для размещения или замены буквального содержимого по определенному URL-адресу

Еще одно отличие в стилях REST-ful и не REST-ful

POST является неидемпотентной операцией: она вызовет некоторые изменения, если выполняется несколько раз с одним и тем же запросом.

PUT является идемпотентной операцией: он не будет иметь побочных эффектов, если выполняется несколько раз с одним и тем же запросом.