Когда вы используете POST и когда вы используете GET? - PullRequest
315 голосов
/ 05 сентября 2008

Из того, что я могу собрать, есть три категории:

  1. Никогда не используйте GET и используйте POST
  2. Никогда не используйте POST и используйте GET
  3. Неважно, какой вы используете.

Правильно ли я предположил эти три случая? Если да, то каковы примеры из каждого случая?

Ответы [ 27 ]

344 голосов
/ 05 сентября 2008

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

http://myblog.org/admin/posts/delete/357

Должен привести вас на страницу подтверждения, а не просто удалить элемент. Так легче избежать несчастных случаев.

POST также более безопасен, чем GET, потому что вы не вставляете информацию в URL. И поэтому использование GET в качестве method для формы HTML, которая собирает пароль или другую конфиденциальную информацию, не является лучшей идеей.

Последнее замечание: POST может передавать больший объем информации, чем GET. «POST» не имеет ограничений по размеру для передаваемых данных, в то время как «GET» ограничен 2048 символами.

189 голосов
/ 05 сентября 2008

Вкратце

  • Используйте GET для safe andidempotent запросов
  • Использовать POST для neither safe nor idempotent запросов

Подробнее Есть подходящее место для каждого. Даже если вы не следуете принципам RESTful , многое можно извлечь из изучения REST и того, как работает подход, ориентированный на ресурсы.

Приложение RESTful будет use GETs для операций, которые оба safe and idempotent.

Операция safe - это операция, которая запрашивает not change the data.

Операция idempotent - это операция, в которой результат будет be the same независимо от того, сколько раз вы его запрашивали.

Разумеется, поскольку GET используются для безопасных операций, они автоматически также идемпотентны . Обычно GET используется для извлечения ресурса (например, вопроса и связанных с ним ответов о переполнении стека) или сбора ресурсов.

Приложение RESTful будет использовать PUTs для операций, которые not safe but idempotent.

Я знаю, что вопрос был о GET и POST, но я вернусь к POST через секунду.

Обычно PUT используется для редактирования ресурса (например, для редактирования вопроса или ответа о переполнении стека).

A POST будет использоваться для любой операции, которая neither safe or idempotent.

Обычно POST используется для создания нового ресурса, например, для создания НОВОГО вопроса SO (хотя в некоторых проектах PUT также будет использоваться для этого).

Если вы запустите POST дважды, вы получите ДВА новых вопроса.

Есть также операция DELETE, но я думаю, я могу оставить это там:)

Обсуждение

В практическом плане современные веб-браузеры обычно поддерживают только GET и POST надежно (вы можете выполнять все эти операции с помощью вызовов javascript, но с точки зрения ввода данных в формы и нажатия кнопки отправки вы обычно получаете две опции). В приложении RESTful POST часто переопределяется, чтобы обеспечить вызовы PUT и DELETE.

Но, даже если вы не следуете принципам RESTful, полезно подумать об использовании GET для получения / просмотра информации и POST для создания / редактирования информации.

Вы никогда не должны использовать GET для операции, которая изменяет данные. Если поисковая система сканирует ссылку на ваш злой оператор или закладка клиента, это может означать большие проблемы.

74 голосов
/ 05 сентября 2008

Используйте GET, если вы не возражаете против повторения запроса (то есть он не меняет состояние).

Используйте POST, если операция изменяет состояние системы.

64 голосов
/ 03 июня 2009

Короткая версия

GET: Обычно используется для отправленных поисковых запросов или любого запроса, когда пользователь хочет, чтобы пользователь снова мог получить точную страницу.

Преимущества GET:

  • URL можно безопасно добавлять в закладки.
  • Страницы можно безопасно перезагружать.

Недостатки GET:

  • Переменные передаются через URL как пары имя-значение. (Риск безопасности)
  • Ограниченное количество переменных, которые могут быть переданы. (На основе браузера. Например, Internet Explorer ограничен 2048 символами. )

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

Преимущества POST:

  • Пары имя-значение не отображаются в URL. (Безопасность + = 1)
  • Неограниченное количество пар имя-значение может быть передано через POST. Reference.

Недостатки POST:

  • Страница, которая использовала данные POST, не может быть закладкой. (Если вам так хочется.)

Более длинная версия

Непосредственно из протокола передачи гипертекста - HTTP / 1.1 :

9,3 GET

Метод GET означает получение любой информации (в форме объекта), идентифицируемой Request-URI. Если Request-URI относится к процессу создания данных, то именно полученные данные должны быть возвращены в качестве объекта в ответе, а не исходный текст процесса, если только этот текст не является выходом процесса.

Семантика метода GET изменяется на «условный GET», если сообщение запроса включает в себя поле заголовка If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match или If-Range , Условный метод GET запрашивает, чтобы объект передавался только при обстоятельствах, описанных в поле (ах) условного заголовка. Условный метод GET предназначен для уменьшения ненужного использования сети, позволяя обновлять кэшированные объекты, не требуя множественных запросов или передачи данных, уже хранящихся у клиента.

Семантика метода GET изменяется на «частичное GET», если сообщение запроса включает в себя поле заголовка Range. Частичное GET запрашивает, чтобы была передана только часть объекта, как описано в разделе 14.35. Метод частичного GET предназначен для уменьшения ненужного использования сети, позволяя завершить частично извлеченные объекты без передачи данных, уже сохраненных клиентом.

Ответ на запрос GET кэшируется тогда и только тогда, когда он отвечает требованиям к кэшированию HTTP, описанным в разделе 13.

См. Раздел 15.1.3 для соображений безопасности при использовании для форм.

9,5 POST

Метод POST используется для запроса, чтобы исходный сервер принял сущность, заключенная в запросе в качестве нового подчиненного ресурса идентифицируется Request-URI в строке запроса. POST разработан чтобы единообразный метод охватывал следующие функции:

  • Аннотация существующих ресурсов;

  • Размещение сообщения на доске объявлений, в группе новостей, списке рассылки, или аналогичная группа статей;

  • Предоставление блока данных, например, результат отправки форма, к процессу обработки данных;

  • Расширение базы данных с помощью операции добавления.

Фактическая функция, выполняемая методом POST, определяется сервера и обычно зависит от Request-URI. Размещенный объект подчинен этому URI так же, как файл подчинен директории, содержащей его, новостная статья подчиняется группа новостей, в которой она размещена, или запись подчинена базы данных.

Действие, выполняемое методом POST, может не привести кресурс, который может быть идентифицирован по URI. В этом случае либо 200 (ОК) или 204 (Нет содержимого) - соответствующий статус ответа, в зависимости от того, включает ли ответ объект, который описывает результат.

27 голосов
/ 15 февраля 2010

Первая важная вещь - это значение GET против POST:

  • GET должен использоваться для ... получения ... некоторой информации с сервера,
  • в то время как POST должен использоваться для отправки некоторой информации на сервер.


После этого можно отметить пару вещей:

  • Используя GET, ваши пользователи могут использовать кнопку "назад" в своем браузере, и они могут создавать закладки для страниц
  • Существует ограничение на размер параметров, которые вы можете передать как GET (2 КБ для некоторых версий Internet Explorer, если я не ошибаюсь) ; предел намного больше для POST и обычно зависит от конфигурации сервера.


В любом случае, я не думаю, что мы могли бы «жить» без GET: подумайте, сколько URL-адресов вы используете с параметрами в строке запроса, каждый день - без GET все это не сработает; -)

11 голосов
/ 15 февраля 2010

Помимо различий в длинах во многих веб-браузерах, есть и семантическая разница. Предполагается, что GET являются «безопасными» в том смысле, что они предназначены только для чтения и не изменяют состояние сервера. POST обычно изменяет состояние и выдает предупреждения при повторной подаче. Сканеры поисковых систем могут делать GET, но никогда не должны делать POST.

Используйте GET, если вы хотите прочитать данные без изменения состояния, и используйте POST, если хотите обновить состояние на сервере.

8 голосов
/ 15 февраля 2010

Одно практическое отличие состоит в том, что браузеры и веб-серверы имеют ограничение на количество символов, которые могут существовать в URL. Это отличается от приложения к приложению, но, безусловно, можно поразить его, если у вас есть textarea s в ваших формах.

Еще одна проблема с GET - они индексируются поисковыми системами и другими автоматическими системами. У Google когда-то был продукт, который предварительно выбирал ссылки на странице, которую вы просматривали, поэтому они быстрее загружались, если вы нажимали эти ссылки. Это вызвало крупный хаос на сайтах, на которых были ссылки типа delete.php?id=1 - люди потеряли свои сайты целиком.

8 голосов
/ 05 сентября 2008

Мое общее правило - использовать Get, когда вы отправляете запросы на сервер, которые не собираются изменять состояние. Сообщения зарезервированы для запросов к серверу, которые изменяют состояние.

7 голосов
/ 05 сентября 2008

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

5 голосов
/ 06 сентября 2008

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

Один пример со страницы граватара: http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802?d=monsterid

GET может привести к незначительно лучшей производительности, некоторые веб-серверы записывают содержимое POST во временный файл перед вызовом обработчика.

Еще одна вещь, которую следует учитывать, это ограничение размера. GET ограничен размером URL-адреса, 1024 байта по стандарту, хотя браузеры могут поддерживать больше.

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

Проблема даже в том, что этот предел меньше, как писал другой автор, все, что в URL, может попасть в другие части пользовательского интерфейса браузера, например в историю.

...