Почему я должен POST данные, а не GET? - PullRequest
14 голосов
/ 01 июня 2010

Я знаю, что вы не хотите размещать форму с именем пользователя и паролем, где кто-либо может использовать историю для просмотра или ситуации, когда повторные действия могут быть нежелательны (обновление страницы = добавление товара в корзину может быть по желанию). Так что у меня есть понимание, когда я могу использовать один поверх другого. Но я всегда мог заставить сервер перенаправить URL после GET, чтобы обойти проблему корзины, и, возможно, большинство моих форм будет отлично работать с GET.

Почему я должен использовать POST over GET? Я не понимаю преимущества одного над другим. Я заметил, что POST не добавляет данные в историю / URL и предупреждает вас об обновлении страницы, но это единственные два различия, которые я знаю. Почему в качестве разработчика я могу использовать один поверх другого?

Ответы [ 5 ]

9 голосов
/ 01 июня 2010

Каждый метод HTTP: POST, GET, PUT, DELETE и т. Д. Имеет свою семантику. При выборе правильного метода важно понимать HTTP и REST , поскольку именно так должен был работать HTTP и как работает базовая сетевая инфраструктура.

Хороший учебник по REST доступен здесь . Вот что говорит о методах POST и GET:

  • Поскольку один и тот же интерфейс используется для каждого ресурса, вы можете рассчитывать на то, что сможете получить представление, т. Е. Некоторую его визуализацию, используя GET. Поскольку семантика GET определена в спецификации, вы можете быть уверены, что у вас нет обязательств, когда вы ее вызываете - вот почему метод называется «безопасный». GET поддерживает очень эффективное и сложное кэширование, поэтому во многих случаях вам даже не нужно отправлять запрос на сервер. Вы также можете быть уверены, что GET является идемпотентным - если вы отправляете запрос GET и не получаете результата, вы можете не знать, достиг ли ваш запрос своего назначения или ответ был утерян на обратном пути к вам.

    Гарантия идемпотентности означает, что вы можете просто отправить запрос снова . Идемпотентность также гарантируется для PUT (что в основном означает «обновить этот ресурс этими данными или создать его по этому URI, если его там еще нет») и для DELETE (которую вы можете просто попробовать снова и снова, пока не получите результат - удаление то, чего нет, не проблема). POST, что обычно означает «создать новый ресурс», также может использоваться для вызова произвольной обработки и, таким образом, не является ни безопасным, ни идемпотентным .

6 голосов
/ 01 июня 2010

Если вам нужен идемпотентный запрос URI (т. Е. Ответ всегда одинаковый), тогда используйте GET, иначе POST.

5 голосов
/ 01 июня 2010

Все данные в запросе GET передаются по URL-адресу, который имеет ограничение по размеру и также виден пользователю.Запрос POST также позволяет отправлять полезную нагрузку.

Помимо технических различий, существует вопрос о намерении.Стандарт HTTP описывает способы использования различных запросов (GET, POST, PUT, DELETE, HEAD);например, PUT предназначен для добавления ресурса, DELETE предназначен для его удаления, а POST предназначен для его изменения.Не могли бы вы использовать GET запрос вместо PUT или DELETE?Конечно, но в соответствии со стандартами намерение является явным.

Подробнее см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html.

1 голос
/ 01 июня 2010

Между прочим, GET ограничен 2K (некоторые браузеры могут принимать больше), и это видно в URL

0 голосов
/ 01 июня 2010

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

Вся сеть переходит на эту семантику. Кэшировать GET-запрос безопасно, но не команду POST - так делают кеширующие прокси. Безопасно получать ресурс несколько раз, поэтому у вас есть средства предварительной выборки ссылок, которые делают именно это. Безопасно создавать закладки и обновлять GET, поэтому нет предупреждений от браузеров и т. Д. И т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...