2010-05-31 2 views
12

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

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

+1

Добавление предметов в корзину с помощью GET - плохая идея, так как запросы GET никогда не должны иметь побочных эффектов на сервере. Существуют программы предварительной выборки, такие как FasterFox и Google Web Accelerator, которые предварительно загружают контент из ссылок на странице, загружая страницы заранее. Если вам не повезло, они могут добавить элементы в корзину, когда ваш пользователь просто читает страницу продукта. – Martin

+1

@Martin. Это имеет смысл. А как насчет аякса? Есть ли разница, если я использую GET или POST? Ничто не может предсказать данные, которые я отправляю, если мне нужно выполнить несколько функций javascript, сделайте запрос. – 2010-05-31 23:20:24

+1

Prefetchers не должны быть проблемой для запросов AJAX, но я все же считаю, что неплохо придерживаться правильной семантики: GET reqs не должен иметь побочных эффектов на сервере (т. Е. Не создавать, удалять и не модифицировать что-либо). Если вы просто извлекаете данные (например, для окна автозаполнения), а представленные данные достаточно малы, чтобы соответствовать URL-адресу, GET должен работать нормально. В отличие от ответов POST, ответы GET можно даже кэшировать, что улучшает воспринимаемую производительность приложения. – Martin

ответ

8

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

Доступен хороший учебник по REST here. Вот что говорит о POST и GET методы:

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

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

+0

Я раньше смотрел на эту страницу отдыха. Это не было полезно. я все еще не понимаю, почему я должен использовать друг друга, за исключением двух различий, о которых я упоминал. Я не понимаю, почему многие из моих запросов на чтение/запись не должны получать (это для меня проще) – 2010-05-31 23:02:14

+0

ИМХО, понимание REST - это ключ к ответу на ваш вопрос. Я добавил ссылку на другую вводную статью REST и процитировал раздел, где они объясняют безопасные и идемпотентные методы. Важно понимать, что базовая веб-инфраструктура (прокси, шлюзы и т. Д.) Будет работать в соответствии с REST (или спецификацией HTTP). – Dan

6

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

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

См. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html для получения дополнительной информации.

+0

Как намерение имеет значение? Я не могу вспомнить, где я это видел, но я заметил, что данные POST не обновили кеш страниц, поэтому кажется, что get сделал бы то же самое. – 2010-05-31 22:57:55

+0

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

+0

Иными словами, в ООП вы можете спросить, почему вы должны использовать 'getProperty()' только для получения свойства и 'setProperty()' только для его установки, когда вы можете сделать обратное так же легко. Наличие стандарта не позволяет нам удивляться. – danben

1

Среди прочего, ПОЛУЧИТЬ ограничивается 2K (некоторые браузеры будут принимать больше), и это видно в URL

6

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

+0

если я получу /blah.aspx и опубликую сообщение/cmd делает/бла-а? Также я видел где-то, где GET был кешем даже после публикации (возможно, это была ошибка браузера? Но, похоже, это не имело значения, были ли данные GET или POST-ed) – 2010-05-31 23:04:13

+0

Ответ не обязательно такой же, просто нет наблюдаемые побочные эффекты от повторяющихся запросов. Эта страница не всегда будет одинаковой, но я получаю ее несколько раз, и это не вызовет наблюдаемого побочного эффекта (по крайней мере, для меня, Jeff и Co.). Может заметить множество ошибок в журналах и т. Д. Но они имеют отношение к пользователь) –

+0

Марк Брэкетт: Так звучит так, как будто вы говорите, что GET разрешает предварительную выборку, где сообщение не является. Но предварительная выборка формы не имеет смысла, и прямо сейчас я делаю это с ajax, который также не имеет смысла, поскольку он не может предсказать вход javascript, который ему понадобится. – 2010-05-31 23:13:43

0

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

Весь текст сайта распространяется на эти семантики. Безопасно кэшировать запрос GET, но не команду POST - так это то, что делают кеширующие прокси. Это безопасно, чтобы ПОЛУЧИТЬ ресурс несколько раз, поэтому у вас есть предварительные выборки ссылок, которые делают именно это. Безопасно добавлять закладки и обновлять GET, поэтому нет предупреждений от браузеров и т. Д. И т. Д.

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

+0

Да, но он не находится в истории и может быть восстановлен через несколько месяцев (если он все еще существует). Вопрос в том, что если я делаю get/a, он может быть кэширован, и если я опубликую/b, результаты не будут кэшироваться, но если я нахожусь/снова, я все еще буду хранить старые данные в кеше? делает кеш пост-остатка в домене? или он просто говорит, что не кэширует эту конкретную страницу? – 2010-05-31 23:11:02

+0

@ acidzombie-он просто говорит, не кэширует этот запрос. –

Смежные вопросы