Кажется, что они оба отправляют данные на сервер внутри тела, так что же их отличает?
В чем разница между POST и PUT HTTP REQUEST?
Ответы (19)
HTTP PUT:
PUT помещает файл или ресурс по определенному URI, и именно по этому URI. Если в этом URI уже есть файл или ресурс, PUT заменяет этот файл или ресурс. Если там нет файла или ресурса, PUT создает его. PUT является идемпотентным, но, как ни парадоксально, ответы PUT не кэшируются .
HTTP 1.1 RFC расположение для PUT
HTTP POST:
POST отправляет данные на определенный URI и ожидает, что ресурс в этом URI обработает запрос. На этом этапе веб-сервер может определить, что делать с данными в контексте указанного ресурса. Метод POST не является идемпотентным, однако ответы POST < em> кэшируются, пока сервер устанавливает соответствующие заголовки 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 (перемещен навсегда); затем пользовательский агент МОЖЕТ принять собственное решение относительно перенаправления запроса.
Кроме того, немного более кратко, RFC 7231, раздел 4.3.4 PUT состояния (курсив наш),
4.3.4. PUT
Метод PUT запрашивает, чтобы состояние целевого ресурса было
created
илиreplaced
с состоянием, определенным представлением, заключенным в полезную нагрузку сообщения запроса.
Использование правильного метода, не имеющего отношения к делу:
Одно из преимуществ REST ROA по сравнению с SOAP заключается в том, что при использовании HTTP REST ROA он способствует правильному использованию глаголы / методы HTTP. Так, например, вы можете использовать PUT только тогда, когда хотите создать ресурс в этом точном месте. И вы никогда не стали бы использовать GET для создания или изменения ресурса.
If the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI
. Так что реализация PUT, которая отказывается создавать ресурс, если его нет, была бы правильной, верно? Если да, то происходит ли это на практике? Или реализации обычно и создают на PUT?
- person houcros; 24.01.2017
allows a user agent to know when the representation body it has in memory remains current
, то есть сервер MUST NOT send ... an ETag or Last-Modified ... unless the request's representation was saved without any transformation
. Клиентов с таким кешем может быть не так много, но серверы должны соответствовать спецификации.
- person Slawomir Brzezinski; 08.11.2020
Только семантика.
Предполагается, что HTTP PUT
принимает тело запроса, а затем сохраняет его в ресурсе, идентифицированном URI.
HTTP POST
является более общим. Предполагается инициировать действие на сервере. Это действие может заключаться в сохранении тела запроса в ресурсе, идентифицированном URI, или это может быть другой URI, или это может быть другое действие.
PUT - это похоже на загрузку файла. Помещение в URI влияет именно на этот URI. POST для URI вообще может иметь какой-либо эффект.
Чтобы привести примеры ресурсов в стиле REST:
POST /books
с кучей информации о книге может создать новую книгу и ответить новым URL-адресом, идентифицирующим эту книгу: /books/5
.
PUT /books/5
придется либо создать новую книгу с идентификатором 5, либо заменить существующую книгу с идентификатором 5.
В нересурсном стиле POST
можно использовать практически для всего, что имеет побочный эффект. Еще одно отличие состоит в том, что PUT
должен быть идемпотентным - несколько PUTs
одних и тех же данных по одному и тому же URL-адресу должно быть нормально, тогда как несколько POSTs
могут создавать несколько объектов или что-то еще, что делает ваше POST
действие.
- GET: получает данные с сервера. Другого эффекта не должно иметь.
- PUT: заменяет целевой ресурс полезными данными запроса. Может использоваться для обновления или создания новых ресурсов.
- PATCH: похоже на PUT, но используется для обновления только определенных полей в существующем ресурсе.
- POST: выполняет обработку полезных данных для конкретного ресурса. Может использоваться для различных действий, включая создание нового ресурса, загрузку файла или отправку веб-формы.
- УДАЛИТЬ: удаляет данные с сервера.
- TRACE: позволяет проверить, что получает сервер. Он просто возвращает то, что было отправлено.
- OPTIONS: позволяет клиенту получать информацию о методах запроса, поддерживаемых службой. Соответствующий заголовок ответа - Разрешить с поддерживаемыми методами. Также используется в CORS как предварительный запрос для информирования сервера о фактическом методе запроса и запроса пользовательских заголовков.
- HEAD: возвращает только заголовки ответа.
- CONNECT: используется браузером, когда он знает, что общается с прокси-сервером, а окончательный URI начинается с https: //. Назначение CONNECT - разрешить сеанс TLS с сквозным шифрованием, чтобы данные не считывались прокси-сервером.
PUT предназначен как метод для «загрузки» материала в конкретный URI или перезаписи того, что уже есть в этом URI.
С другой стороны, POST - это способ отправки данных, СВЯЗАННЫХ с заданным URI.
См. HTTP RFC.
Насколько мне известно, PUT в основном используется для обновления записей.
POST - для создания документа или любого другого ресурса
PUT - обновить созданный документ или любой другой ресурс.
Но чтобы прояснить этот вопрос, PUT обычно «заменяет» существующую запись, если она есть, и создает, если ее нет ...
Другие уже опубликовали отличные ответы, я просто хотел добавить, что с большинством языков, фреймворков и вариантов использования вы будете иметь дело POST
гораздо, гораздо чаще, чем PUT
. До такой степени, что PUT, DELETE,
и т. Д. - это в основном пустяковые вопросы.
См.: 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.
Определите операции с помощью методов HTTP
Протокол HTTP определяет ряд методов, которые придают семантическое значение запросу. Наиболее распространенные методы HTTP, используемые большинством веб-API RESTful:
GET извлекает представление ресурса по указанному URI. Тело ответного сообщения содержит подробную информацию о запрошенном ресурсе.
POST создает новый ресурс по указанному URI. В теле сообщения запроса содержатся сведения о новом ресурсе. Обратите внимание, что POST также может использоваться для запуска операций, которые фактически не создают ресурсы.
PUT либо создает, либо заменяет ресурс по указанному URI. В теле сообщения запроса указывается ресурс, который должен быть создан или обновлен.
PATCH выполняет частичное обновление ресурса. В теле запроса указывается набор изменений, применяемых к ресурсу.
DELETE удаляет ресурс по указанному URI.
Эффект от конкретного запроса должен зависеть от того, является ли ресурс коллекцией или отдельным элементом. В следующей таблице приведены общие соглашения, принятые в большинстве реализаций RESTful на примере электронной коммерции. Не все из этих запросов могут быть реализованы - это зависит от конкретного сценария.
Resource | POST | GET | PUT | DELETE |
---|---|---|---|---|
/customers | Create a new customer | Retrieve all customers | Bulk update of customers | Remove all customers |
/customers/1 | Error | Retrieve the details for customer 1 | Update the details of customer 1 if it exists | Remove customer 1 |
/customers/1/orders | Create a new order for customer 1 | Retrieve all orders for customer 1 | Bulk update of orders for customer 1 | Remove all orders for customer 1 |
Различия между POST, PUT и PATCH могут сбивать с толку.
Запрос POST создает ресурс. Сервер назначает URI новому ресурсу и возвращает этот URI клиенту. В REST model
вы часто применяете POST
запросы к коллекциям. Новый ресурс добавлен в коллекцию. Запрос POST
также может использоваться для отправки данных для обработки в существующий ресурс без создания какого-либо нового ресурса.
Запрос PUT создает ресурс или обновляет существующий ресурс. Клиент указывает URI для ресурса. Тело запроса содержит полное представление ресурса. Если ресурс с этим URI уже существует, он заменяется. В противном случае создается новый ресурс, если сервер поддерживает это. PUT
запросы чаще всего применяются к ресурсам, которые представляют собой отдельные элементы, такие как конкретный заказчик, а не коллекции. Сервер может поддерживать обновления, но не создание через PUT
. Поддерживать ли создание через PUT
зависит от того, может ли клиент осмысленно назначать URI ресурсу до того, как он существует. В противном случае используйте POST
для создания ресурсов и PUT or PATCH
для обновления.
Запрос PATCH выполняет частичное обновление существующего ресурса. Клиент указывает URI для ресурса. В теле запроса указывается набор изменений, применяемых к ресурсу. Это может быть более эффективным, чем использование PUT
, потому что клиент отправляет только изменения, а не все представление ресурса. Технически PATCH
также может создать новый ресурс (указав набор обновлений для нулевого ресурса), если сервер поддерживает это.
PUT
запросы должны быть идемпотентными. Если клиент отправляет один и тот же PUT
запрос несколько раз, результаты всегда должны быть одинаковыми (один и тот же ресурс будет изменен с одинаковыми значениями). POST and PATCH
запросы не могут быть идемпотентными.
POST считается чем-то вроде метода фабричного типа. Вы включаете в него данные, чтобы создать то, что хотите, и все, что находится на другом конце, знает, что с этим делать. PUT используется для обновления существующих данных по заданному URL-адресу или для создания чего-то нового, когда вы знаете, каким будет URI, а он еще не существует (в отличие от POST, который создаст что-то и вернет URL-адрес для при необходимости).
Когда использовать тот или иной вариант, должно быть довольно просто, но сложные формулировки сбивают с толку многих из нас.
Когда их использовать:
Используйте
PUT
, если вы хотите изменить отдельный ресурс, который уже является частью коллекции ресурсов.PUT
полностью заменяет ресурс. Пример:PUT /resources/:resourceId
Примечание: используйте
PATCH
, если вы хотите обновить часть ресурса.
- Используйте
POST
, если хотите добавить дочерний ресурс в коллекцию ресурсов.
Пример:POST => /resources
В основном:
- Как правило, на практике всегда используйте
PUT
для операций UPDATE. - Всегда используйте
POST
для операций CREATE.
Пример:
GET
/ company / reports => Получить все отчеты GET
/ company / reports / {id} => Получить информацию об отчете по идентификатору POST
/ company / reports => < em> Создать новый отчет PUT
/ company / reports / {id} => Обновить информацию отчета, идентифицированную "id" PATCH
/ company / reports / {id} => Обновить часть информации отчета, обозначенную идентификатором em > DELETE
/ company / reports / {id} => Удалить отчет по "id"
Разница между POST и PUT заключается в том, что PUT является идемпотентным, это означает, что вызов одного и того же запроса PUT несколько раз всегда будет давать один и тот же результат (это не является побочным эффектом), в то время как, с другой стороны, повторный вызов запроса POST может иметь ( дополнительные) побочные эффекты многократного создания одного и того же ресурса.
GET
: Запросы с использованием GET только извлекают данные, то есть запрашивают представление указанного ресурса.
POST
: он отправляет данные на сервер для создания ресурса. Тип тела запроса указывается заголовком Content-Type. Это часто вызывает изменение состояния или побочные эффекты на сервере.
PUT
: Создает новый ресурс или заменяет представление целевого ресурса полезными данными запроса.
PATCH
: используется для частичного изменения ресурса.
DELETE
: удаляет указанный ресурс
TRACE
: он выполняет проверку обратной связи сообщений на пути к целевому ресурсу, обеспечивая полезный механизм отладки.
OPTIONS
: используется для описания параметров связи для целевого ресурса, клиент может указать URL-адрес для метода OPTIONS или звездочку (*) для ссылки на весь сервер.
HEAD
: запрашивает ответ, идентичный ответу на запрос GET, но без тела ответа.
CONNECT
: устанавливает туннель к серверу, идентифицированному целевым ресурсом, может использоваться для доступа к веб-сайтам, использующим SSL (HTTPS).
Простыми словами можно сказать:
1.HTTP Get: используется для получения одного или нескольких элементов.
2.HTTP-сообщение: используется для создания элемента.
3.HTTP Put: используется для обновления элемента
4.HTTP-патч: используется для частичного обновления элемента.
5.HTTP Delete: используется для удаления элемента.
Стоит отметить, что POST
подвержен некоторым распространенным атакам подделки межсайтовых запросов (CSRF), а PUT
- нет.
Приведенные ниже CSRF невозможны с PUT
, когда жертва посещает attackersite.com
.
Эффект атаки заключается в том, что жертва непреднамеренно удаляет пользователя только потому, что он (жертва) вошел в систему как admin
на target.site.com
перед посещением attackersite.com
:
Вредоносный код на attackersite.com
:
Случай 1. Обычный запрос. сохраненные target.site.com
файлы cookie будут автоматически отправлены браузером: (примечание: поддержка только PUT
на конечной точке безопаснее, потому что это не поддерживаемое значение атрибута <form>
)
<!--deletes user with id 5-->
<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>
Случай 2: запрос XHR. сохраненные target.site.com
файлы cookie будут автоматически отправлены браузером: (примечание: поддержка только PUT
на конечной точке безопаснее, потому что попытка отправить PUT
вызовет предварительный запрос, ответ на который не позволит браузеру запросить deleteUser
страницу)
//deletes user with id 5
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://target.site.com/deleteUser");
xhr.withCredentials=true;
xhr.send(["userId=5"]);
MDN Ref: [..] В отличие от «простого запросы »(обсуждалось выше), - [[Means: POST / GET / HEAD]] - для предварительно заданных запросов браузер сначала отправляет HTTP-запрос, используя метод OPTIONS [..]
cors в действии: [..] Некоторые типы запросы, такие как DELETE или PUT, должны идти дальше и запрашивать разрешение сервера перед выполнением фактического запроса [..], что называется предварительным запросом [..]
Использование REST-ful
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 и non-REST-ful
POST
- неидемпотентная операция: она вызовет некоторые изменения, если будет выполняться несколько раз с одним и тем же запросом.
PUT
- это идемпотентная операция: она не будет иметь побочных эффектов, если будет выполняться несколько раз с одним и тем же запросом.
На самом деле нет никакой разницы, кроме названия. На самом деле есть принципиальная разница между GET и другими. С помощью метода "GET" -Request вы отправляете данные в строке url-адреса, которые разделяются сначала вопросительным знаком, а затем знаком &.
Но с методом запроса «POST» вы не можете передавать данные по URL-адресу, но вы должны передавать данные как объект в так называемом «теле» запроса. На стороне сервера вы должны затем прочитать тело полученного контента, чтобы получить отправленные данные. Но с другой стороны, нет возможности отправлять контент в теле, когда вы отправляете "GET" -Request.
Утверждение, что «GET» предназначен только для получения данных, а «POST» - для отправки данных, абсолютно неверно. Никто не может помешать вам создавать новый контент, удалять существующий контент, редактировать существующий контент или делать что-либо в бэкэнде на основе данных, отправленных запросом «GET» или запросом «POST». И никто не может помешать вам закодировать серверную часть таким образом, чтобы с помощью "POST" -запроса клиент запрашивал некоторые данные.
С запросом, независимо от того, какой метод вы используете, вы вызываете URL-адрес и отправляете или не отправляете некоторые данные, чтобы указать, какую информацию вы хотите передать на сервер для обработки вашего запроса, а затем клиент получает ответ от сервер. Данные могут содержать все, что вы хотите отправить, бэкэнд может делать с данными все, что захочет, а ответ может содержать любую информацию, которую вы хотите туда поместить.
Есть только эти два ОСНОВНЫХ МЕТОДА. ПОЛУЧИТЬ и ОТПРАВИТЬ. Но их отличает их структура, а не то, что вы кодируете в бэкэнде. В бэкэнде вы можете кодировать все, что хотите, с полученными данными. Но с запросом «POST» вы должны отправлять / получать данные в теле, а не в строке url-адреса, а с запросом «GET» вы должны отправлять / получать данные в строке url-address, а не в тело. Это все.
Все остальные методы, такие как «PUT», «DELETE» и т. Д., Имеют ту же структуру, что и «POST».
Метод POST в основном используется, если вы хотите несколько скрыть содержимое, потому что все, что вы пишете в строке url-адреса, будет сохранено в кеше, а метод GET аналогичен записи строки url-адреса с данными. Поэтому, если вы хотите отправить конфиденциальные данные, которые не всегда обязательно являются именем пользователя и паролем, но, например, некоторые идентификаторы или хэши, которые вы не хотите отображать в строке url-address-line, вам следует использовать метод POST .
Также длина строки URL-адреса ограничена 1024 символами, тогда как метод "POST" не ограничен. Поэтому, если у вас большой объем данных, вы не сможете отправить его с помощью GET-запроса, но вам нужно будет использовать POST-запрос. Так что это еще один плюс для POST-запроса.
Но работать с GET-запросом намного проще, когда у вас нет сложного текста для отправки. В противном случае, и это еще один плюс для метода POST, заключается в том, что с помощью метода GET вам необходимо URL-кодировать текст, чтобы иметь возможность отправлять некоторые символы в тексте или даже пробелы. Но с методом POST у вас нет ограничений, и ваш контент не нужно каким-либо образом изменять или манипулировать.
И PUT, и POST - это методы отдыха.
PUT - если мы сделаем один и тот же запрос дважды, используя PUT с одинаковыми параметрами оба раза, второй запрос не будет иметь никакого эффекта. Вот почему PUT обычно используется для сценария обновления, вызывая Update более одного раза с одними и теми же параметрами, не делает ничего, кроме первоначального вызова, поэтому PUT является идемпотентным.
POST не идемпотентен, например Create создаст две отдельные записи в цель, поэтому он не идемпотентен, поэтому CREATE широко используется в POST.
Выполнение одного и того же вызова с использованием POST с одинаковыми параметрами каждый раз вызовет две разные вещи, поэтому POST обычно используется для сценария Create.
Методы запроса GET, PUT и DELETE: CRUD (создание, чтение, обновление и удаление) операций, то есть операций управления данными, для состояния целевого ресурса (указанного в URI запроса):
- GET должен читать состояние целевого ресурса;
- PUT должен создать или обновить состояние целевого ресурса;
- DELETE должно удалить состояние целевого ресурса.
Другой метод запроса POST. Он не должен создавать состояние целевого ресурса, такого как PUT, потому что это операция process с целью более высокого уровня, чем CRUD (см. RFC 7231, § 4.3.3). Процесс может создать ресурс, но отличный от целевого ресурса, в противном случае следует использовать метод запроса цели нижнего уровня PUT, так что даже в этом случае это не делает его операция CRUD.
Разница между операциями CRUD (GET, PUT и DELETE в HTTP) и операциями без CRUD (POST в HTTP) заключается в различии между абстрактными типами данных и объектами, которые Алан Кей подчеркивал в большинстве своих выступлений и в своей статье по ACM Ранняя история Smalltalk :
Что я получил от Simula, так это то, что теперь вы можете заменить привязки и назначения целями. Последнее, что вы хотели бы от любого программиста, - это возиться с внутренним состоянием, даже если оно представлено образно. Вместо этого объекты должны быть представлены как сайты более высокого уровня поведения, более подходящие для использования в качестве динамических компонентов.
[…] К сожалению, большая часть того, что сегодня называют объектно-ориентированным программированием, представляет собой простое программирование в старом стиле с более причудливыми конструкциями. Многие программы загружены операциями в стиле присваивания, которые теперь выполняются более дорогими присоединенными процедурами.
[…] Заявления о назначении - даже абстрактные - выражают цели очень низкого уровня, и для выполнения чего-либо потребуется их больше. […] Еще один способ подумать обо всем этом: хотя позднее связывание автоматического выделения памяти не делает ничего такого, что не может сделать программист, его присутствие приводит как к более простому, так и к более мощному коду. ООП - это стратегия позднего связывания для многих вещей, и все они вместе сдерживают хрупкость и рост размеров намного дольше, чем старые методологии.
Post и Put в основном используются для публикации данных и другого обновления данных. Но вы можете сделать то же самое только с почтовым запросом.