Когда вы используете POST и когда вы используете GET?


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

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

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

28 299

28 ответов:

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

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

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

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

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

коротко

  • использовать GET на safe and idempotent запросы
  • использовать POST на neither safe nor idempotent запросы

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

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

A safe операция-это операция, которая делает not change the data просил.

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

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

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

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

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

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

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

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

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

Обсуждение

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

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

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

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

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

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

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

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

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

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

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

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

преимущества должности:

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

недостатки поста:

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

Версия

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

9.3 GET

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

семантика способ сделать изменения к "условной сделать", если сообщение запроса включает в себя если-модифицированные-С, Если-без изменений-так, если-бы матч, если-нет-Match или if-Range заголовок поля. Условный метод GET запрашивает, чтобы объект был передан только под обстоятельства, описываемые полями условного заголовка. Условный метод GET предназначен для уменьшения ненужного использования сети, позволяя обновлять кэшированные объекты без необходимости нескольких запросов или передачи данных, уже имеющихся у клиента.

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

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

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

9.5 в должности

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

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

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

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

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

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

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

первая важная вещь-это смысл из GET versus POST:

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


После этого, несколько вещей, которые можно отметить :

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


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

помимо разницы в ограничениях длины во многих веб-браузерах, существует также семантическая разница. GETs должны быть "безопасными" в том, что они являются операциями только для чтения, которые не изменяют состояние сервера. Сообщения обычно изменяют состояние и выдают предупреждения о повторной отправке. Веб-искатели поисковых систем могут создавать GETs, но никогда не должны создавать сообщения.

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

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

textareas в ваших формах.

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

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

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

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

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

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

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

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

нет ничего, что вы не можете сделать сами по себе. Дело в том, что ты не должно для изменения состояния сервера на HTTP GET. Прокси HTTP предполагают, что поскольку HTTP GET не изменяет состояние, то не имеет значения, вызывает ли пользователь HTTP GET один раз или 1000 раз. Используя эту информацию, они предполагают, что безопасно возвращать кэшированную версию первого HTTP GET. Если вы нарушите спецификацию HTTP, вы рискуете нарушить HTTP-клиент и прокси в дикой природе. Не делай этого :)

Это переходит в концепцию REST и как веб был своего рода предназначен для использования. Есть отличный подкаст на программной инженерии радио, которое дает углубленный разговор об использовании Get и Post.

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

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

1.3 быстрый контрольный список для выбора HTTP GET или POST

используйте GET if:

    The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).

используйте сообщение, если:

    The interaction is more like an order, or
    The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
    The user be held accountable for the results of the interaction.

источник.

Я не вижу проблемы с использованием get, хотя я использую его для простых вещей, где имеет смысл хранить вещи в строке запроса.

используя его для обновления состояния-как получить delete.php?id=5 удалять страницу-очень рискованно. Люди обнаружили это, когда веб - акселератор Google начал предварительную выборку URL-адресов на страницах-он ударил по всем ссылкам "удалить" и уничтожил данные людей. То же самое может произойти с поисковыми пауками.

пост может перемещать большие объемы данных пока получить не может.

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

взгляните на http://www.w3.org/2001/tag/doc/whenToUseGet.html

с RFC 2616:

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


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

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

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

действие, выполняемое сообщением метод может не привести к ресурсу это можно определить с помощью URI. В в этом случае, либо 200 (OK) или 204 (нет Содержание) является соответствующим ответом статус, в зависимости от того, есть или нет ответ включает в себя объект, который описывает результат.

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

Я не вижу проблемы с использованием GET, хотя я использую его для простых вещей, где имеет смысл держать вещи в строке запроса.

использование GET позволит связать с определенной страницей тоже возможно, где сообщение не будет работать.

GET и POST в основном позволяют отправлять информацию обратно на веб-сервер из браузера (или другого HTTP-клиента, если на то пошло).

представьте, что у вас есть форма на HTML-странице, и нажатие кнопки "Отправить" отправляет данные в форме обратно на сервер, как пары "имя=значение".

выбор GET в качестве "метода" добавит все данные в URL-адрес, и он будет отображаться в строке URL вашего браузера. Объем информации, которую вы можете отправить обратно с помощью GET ограниченные URL-адреса могут содержать только 1024 символа.

проблемы облачной интеграции Скачать Сейчас Сообщение, с другой стороны, будет (как правило) отправлять информацию через сокет обратно на веб-сервер, и он не будет отображаться в строке URL. Вы можете послать гораздо больше информации на сервер таким образом - и это не ограничивается текстовыми данными. Можно отправлять файлы и даже двоичные данные, такие как сериализованные объекты Java!

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

читать статья о HTTP в Википедии. Он объяснит, что такое протокол и что он делает:

GET

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

и

POST Отправляет данные для обработки (например, из HTML-формы) в идентифицированный ресурс. Данные включаются в тело запроса. Это может привести к созданию нового ресурса или обновлению существующих ресурсов или к тому и другому.

W3C имеет документ с именем URI, Адресуемость и использование HTTP GET и POST это все объясняет когда и чем пользоваться. Цитирование

1.3 быстрый контрольный список для выбора HTTP GET или POST

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

и

  • использовать сообщение, если:
    • взаимодействие больше похоже на порядок, или
    • в взаимодействие изменяет состояние ресурса таким образом, чтобы пользователь воспринимал его (например, подписку на услугу), или o пользователь несет ответственность за результаты взаимодействия.

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

практический пример будет всякий раз, когда вы отправляете HTML-форму. Вы указываете либо post или get в форме действия. PHP будет заполнять $_GET и $_POST соответственно.

в PHP POST ограничение данных обычно устанавливается вашим php.ini. GET ограничивается настройками сервера / браузера я считаю-обычно вокруг 255 байт.

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

от w3schools.com:

Что такое HTTP?

протокол передачи гипертекста (HTTP) предназначен для включения связь между клиентами и серверами.

HTTP работает как протокол запроса-ответа между клиентом и сервером.

веб-браузер может быть клиентом, а приложение на компьютере хостами веб-сайта может быть сервер.

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

два метода HTTP-запроса: GET и POST

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

GET-запрашивает данные из указанного ресурса после отправки данных в быть обработанным до указанного ресурс

здесь мы выделяем основные отличия:

enter image description here

Ну одна важная вещь-это все, что вы представляете над GET будет отображаться через URL-адрес. Во-вторых, как говорит Ceejayoz, существует ограничение на символы для URL.

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

Edit: я должен уточнить--для общих шаблонов программирования. Обычно ответ на сообщение с прямой веб-страницей HTML является сомнительным дизайном по целому ряду причин, одна из которых раздражает: "вы должны повторно отправить эту форму, вы хотите это сделать?"при нажатии кнопки "Назад".

как ответили другие, есть ограничение на размер url с get, и файлы могут быть отправлены только с post.

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

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

скриптовые языки предоставляют множество средств для доступа к запросу. Например, PHP позволяет использовать $_REQUEST чтобы получить сообщение или получить. Следует избегать этого в пользу более конкретного $_GET или $_POST.

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

Gorgapor, mod_rewrite по-прежнему часто использует GET. Это просто позволяет перевести более дружественный URL в URL с GET строку запроса.

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

серверы должны быть осторожны в зависимости от длины URI выше 255 байты, потому что какой-то старый клиент или прокси-реализации могут быть неправильно поддержите эти длины

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

HTTP POST используются, когда вы хотите отправить данные против ресурса url.

типичный пример использования HTTP GET - это поиск, т. е. поиск?Запрос=мой + запрос Типичным примером использования HTTP-сообщения является отправка обратной связи в онлайн-форму.