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

Насколько я понимаю, есть три категории:

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

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


person Thomas Owens    schedule 05.09.2008    source источник
comment
На самом деле это абсолютно не так. GET и POST видны в одинаковой степени, если вы проверите заголовки, отправленные вашим браузером, вы увидите список пар ключ-значение, которые вы публикуете.   -  person Velimir Tchatchevsky    schedule 17.09.2015
comment
w3.org/2001/tag/doc/whenToUseGet.html   -  person icc97    schedule 23.10.2015
comment
Не существует стандартного способа кодирования не только пары «имя -› »в строки запроса, поэтому, если ваши запросы не являются очень простыми (например, без массивов или вложенных структур данных), вам следует рассматривать только POST, который предоставляет поле тела, которое вы можете использовать с форматами кодирования. (JSON, XML и т. Д.).   -  person themihai    schedule 15.07.2016
comment
См. Этот ответ: stackoverflow.com/a/63170529/989468   -  person Chiwda    schedule 26.08.2020
comment
См. Также мой ответ: stackoverflow.com/a/63170529/989468   -  person Chiwda    schedule 21.09.2020


Ответы (27)


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

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

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

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

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

person Brian Warshaw    schedule 05.09.2008
comment
Ответы на запросы GET могут быть кешированы. Ответов на POST не должно. - person mkoeller; 05.12.2008
comment
Как отсутствие информации в URL-адресе делает его более безопасным? (Кстати, я один из тех, кто считает, что ложное чувство безопасности более опасно, чем отсутствие безопасности вообще). - person ePharaoh; 15.04.2009
comment
@ePharaoh: Люди не читают пароли, заглядывая через плечо пользователя в адресную строку. - person Quentin; 03.06.2009
comment
@ePharaoh: Предоставление немного меньшего объема данных случайному наблюдателю, вероятно, было бы лучшей формулировкой, чем более безопасная - URL-адреса могут оказаться во многих местах, таких как журналы, ссылки, кеши. Вы, конечно, правы, это не увеличивает безопасность, но ограничивает наихудшие небезопасные методы (см. Также: thedailywtf.com/Articles/The_Spider_of_Doom.aspx) - person Piskvor left the building; 03.06.2009
comment
@ Дэвид Дорвард: Или, по более распространенному названию: атака плеча. - person Idan K; 29.08.2010
comment
@Brian Warshaw, я думаю, вы все еще можете использовать POST для деструктивных действий, если запрос аутентифицирован, и вы используете его только во время перенаправления URL. Что вы думаете? - person Ray Cheng; 01.06.2012
comment
@ePharaoh, вы никогда не должны использовать GET для чего-то вроде формы входа, например. В этом случае это будет менее безопасно. Это означает, что кто-то может добавить в закладки логин с пользователем / передать открытый текст на своем компьютере. Затем отправьте этот URL-адрес их коллегам, потому что они слишком ленивы, чтобы увидеть, что они отправляют. Подумайте: http://example.com/login?username=moe&password=yourenotsupposedtoseeme - person cbmeeks; 11.12.2012
comment
Максимальный размер строки для URL определяется браузером из памяти, большинство из которых ограничено 2083 из-за того, что IE устанавливает стандарт (низкий стандарт, вставить барабан), но да, он изменит браузер на браузер и поисковые роботы обычно используются только URL-адреса длиной менее 2048 символов - person Michael Crook; 18.03.2014
comment
@ePharaoh многие веб-серверы, такие как apache, будут регистрировать каждый URL-адрес в журнале доступа, поэтому, если у вас была форма, использующая GET с паролем в ней, тогда это было бы зарегистрировано GET / insecure? password = foo HTTP / 1.1, поэтому у вас будет каждый пароль в виде открытого текста на диске, что является большой угрозой безопасности - person Ransom Briggs; 14.01.2015
comment
Почему для удаления следует использовать POST, а не DELETE? - person 1252748; 15.09.2015
comment
@thomas Насколько я понял, когда писал этот ответ, не многие браузеры (в то время, возможно, и сегодня) действительно отправляют запросы DELETE или PUT - они отправляют только GET и POST. Очевидно, что если вы пишете API, а не приложение на основе браузера, DELETE будет семантически правильным. - person Brian Warshaw; 15.09.2015
comment
Является ли эмпирическое правило передовым для отправки запроса или есть какой-то еще больший риск, если использовать Get over Post для ответа? Например, получение информации о детали, которую можно получить по номеру детали, что не имеет большого значения, передаваемого через URL-адрес (по крайней мере, насколько я знаю). - person eaglei22; 20.12.2016
comment
@ eaglei22 Насколько мне известно, механизм ответа не отличается от метода запроса к методу запроса. Веб-серверы отвечают на IP-адреса клиентов, а не на URL-адреса, поэтому опасения по поводу конфиденциальной информации в URL-адресе GET-запроса не оправдываются. - person Brian Warshaw; 21.12.2016
comment
Как это работает в случае мобильного приложения, у которого нет браузера для чтения данных с сервера. Имеет ли значение использование GET или POST для чтения данных в случае мобильного приложения! - person CoDe; 20.08.2017
comment
@CoDe Да, конечно. Когда вы делаете запросы к API и другим конечным веб-точкам из мобильного приложения, вы по-прежнему используете HTTP, и вам все равно нужно указать какой-то метод запроса. Ограничение размера запроса для GET по-прежнему будет применяться, и если вы используете современный API, разные методы запроса, вероятно, также будут обрабатываться по-разному. - person Brian Warshaw; 21.08.2017
comment
@BrianWarshaw - Как вы относитесь к редактированию, чтобы прояснить POST и GET с точки зрения безопасности? Я вижу много новых инженеров, которые думают, что им не нужно использовать HTTPS для защиты формы входа, поскольку они используют POST. Я думаю, что то, как это написано в вашем ответе, может ввести в заблуждение. Многие новые инженеры, с которыми я работаю, не знают, что эта информация все еще может попадать в журналы, в которых хранятся заголовки HTTP и сообщения тела HTTP, и может быть прочитана в трассировках tcpflow. - person jmort253; 12.03.2018
comment
Приведенный выше пример myblog.org/admin/posts/delete/357 подойдет для страница подтверждения для действия с одним параметром, такого как удаление сообщения, но при создании страницы подтверждения, например, для создания сообщения, требующего нескольких параметров, было бы более целесообразно использовать запрос POST. Основная причина такого различия заключается в том, что URL-адрес должен выражать действие, которое необходимо подтвердить, но при наличии нескольких параметров это становится труднее. - person Damien Golding; 17.03.2019
comment
Используйте POST, когда вам нужно отправить параметры. Лучше оставить GET максимум для одного числового параметра, который является идентификатором вашего объекта / записи. GET, если вы действительно хотите создать ресурс с возможностью совместного использования по URL. - person profimedica; 24.09.2019
comment
Предположим, у меня есть конечная точка, которая принимает файл в качестве входных данных, выполняет некоторую обработку файла (пример - извлечение данных на основе регулярного выражения) и возвращает данные JSON, тогда я могу использовать запрос GET для загрузки файла на сервер. Или мне следует использовать POST-запрос? - person variable; 05.12.2019
comment
2048 - неточно. Это только для IE и старых браузеров. Chrome теперь поддерживает до 2 МБ. Safari 64k. Край 81к. - person johntrepreneur; 09.06.2021

Вкратце

  • Используйте GET для safe and idempotent запросов
  • Используйте 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 используется для редактирования ресурса (например, редактирования вопроса или ответа при переполнении стека).

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

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

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

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

Обсуждение

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

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

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

person reefnet_alex    schedule 05.09.2008
comment
если вы создадите ресурс APIREST для входа в систему, который вы выберете, это безопасно и идемпотентно, я буду гостем. - person jhonny lopez; 28.04.2016
comment
Безопасное получение не является автоматически идемпотентным. Набор результатов может отличаться от одного и того же недеструктивного запроса. - person RichieHH; 05.10.2017
comment
То, как вы это написали, что-то вроде GET currenttime было бы неправильным, потому что оно не идемпотентно (в том смысле, что повторяющиеся запросы могут давать разные результаты); фактически все запрашиваемое может со временем измениться. Таким образом, идемпотентность следует выражать скорее в терминах побочных эффектов самого запроса . Поскольку простой запрос текущего времени не имеет побочных эффектов, этот - как и следовало ожидать - идеальный кандидат для GET, а не POST. - person Hagen von Eitzen; 04.08.2018
comment
что, если я хочу просмотреть данные, но мне нужно передать массив или JSON в качестве параметра, по-прежнему можно преобразовать массив в строку и отправить его как GET, или в этом случае можно просто использовать POST и отправить массив в организме? - person A.J Alhorr; 25.08.2020
comment
Обычно в запросе GET любые параметры существуют в строке запроса URL-адреса. Теперь в спецификации HTTP нет ограничений, которые мешают вам иметь непустое тело запроса GET, но некоторые конфигурации сервера могут не допускать этого. Я думаю, что API эластичного поиска позволяет, например, информацию в теле запроса GET. Сейчас это все преференциально. - person spencer741; 23.06.2021

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

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

person Douglas Leeder    schedule 05.09.2008
comment
Поскольку форма изменяет состояние системы, почему метод по умолчанию для тега HTML-формы - GET? - person ziiweb; 24.08.2011
comment
@ user248959 Меняет ли окно поиска видимое состояние? По умолчанию выставили давно, наверное, почти случайно. Я не углублялся в историю, чтобы даже знать, была ли опция POST в точечных формах. - person Douglas Leeder; 25.08.2011
comment
@ziiweb Даже если в большинстве случаев ‹form› используется POST, лучше определить dafault как безобидный GET. Это может показаться абсурдным с точки зрения безопасности, когда это приводит к отображению данных в файлах журнала и т. Д., Но это отказоустойчиво в отношении данных на стороне сервера (служба не должна изменять данные при GET). Я полагаю, что сегодня можно было бы установить фокус по-другому (желательно, отказавшись от любого значения по умолчанию и сделав method обязательным) - person Hagen von Eitzen; 04.08.2018
comment
Предположим, у меня есть конечная точка, которая принимает файл в качестве входных данных, выполняет некоторую обработку файла (пример - извлечение данных на основе регулярного выражения) и возвращает данные JSON, тогда я могу использовать запрос GET для загрузки файла на сервер. Или мне следует использовать POST-запрос? - person variable; 05.12.2019

Укороченная версия

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

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

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

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

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

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

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

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

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

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

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

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

9.3 ПОЛУЧИТЬ

Метод 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 (Нет содержимого), в зависимости от того, включает ли ответ сущность, описывающую результат.

person Cimplicity    schedule 03.06.2009
comment
Страница, на которой использовались данные публикации, не может быть добавлена ​​в закладки: ну, это преимущество, не так ли? Вероятно, вы не хотите, чтобы ваш запрос, изменяющий данные, был добавлен в закладки. - person Piskvor left the building; 03.06.2009
comment
Я полагаю, если бы каждый раз, когда использовался пост, вы использовали его в целях безопасности, это было бы преимуществом. Обычно это так, но есть ограничение на длину для GET. Может быть, кто-то просто передает тонну данных, не связанных с безопасностью, и хочет, чтобы страница была добавлена ​​в закладки? Кто знает... - person Cimplicity; 03.06.2009
comment
Что касается недостатка GET, а именно того, что переменные передаются через URL-адрес как пары имя-значение, устранит ли MVC эту проблему из-за маршрутизации и результирующих дружественных URL-адресов? - person MrBoJangles; 30.06.2011
comment
@MrBoJangles: использование красивых URL-адресов не предотвращает упомянутого риска «человека, оглядывающегося через плечо». Боковое примечание: MVC не требует маршрутизации с хорошими URL-адресами, а маршрутизация с хорошими URL-адресами не требует MVC; иногда они используются вместе, но могут использоваться и по отдельности. - person icktoofay; 28.07.2012
comment
В мире .NET для всех практических целей хорошая возможность url = MVC. Я полагаю, вы могли бы немного переписать IIS или какие-нибудь странные, основанные на коде, но они еще менее приятны. MVC, разумеется, для победы. - person MrBoJangles; 30.07.2012
comment
Страница, на которой использованные данные поста не могут быть добавлены в закладки, - это наглая ложь. Ты сможешь. По крайней мере, на mozilla - person Trect; 26.12.2019

Первое, что важно - это значение GET по сравнению с POST:

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


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

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


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

person Pascal MARTIN    schedule 15.02.2010
comment
Что ж, если бы все использовали симпатичные URL-адреса в стиле GET: http://example.com/var1/value1/var2/value2/var3/value3, мы могли бы «технически» больше не использовать GET ... - person Tyler Carter; 15.02.2010
comment
@ Chacha102 За исключением того, что вам все еще нужно ПОЛУЧИТЬ этот ресурс. Почти все страницы, изображения, сценарии и т. Д. Загружаются в веб-браузеры с помощью GET. - person Ryan; 15.02.2010
comment
@ Chacha102 - Даже www.mypage.com/contact/ внутренне использует GET для чего-то вроде index.php?url=/contact/ - person Thiago Belem; 15.02.2010
comment
Акцент на ограничении размера GET! Кроме того, параметры GET включены в закладки, а параметры POST - нет. И пользователь может обновить страницу, запрошенную GET, но не страницу, запрошенную POST (без предупреждения о повторной отправке информации). - person Ricket; 15.02.2010

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

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

person Mark Byers    schedule 15.02.2010
comment
+1. Это ключевое концептуальное отличие от RFC, из которого следует все остальное. w3.org/Protocols/rfc2616/rfc2616-sec9.html# сек9,3 - person Frank Farmer; 15.02.2010

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

person TonyLa    schedule 05.09.2008

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

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

person ceejayoz    schedule 15.02.2010
comment
Ваш веб-сервер, вероятно, также имеет ограничения на это. - person Billy ONeal; 15.02.2010
comment
Что ж, есть ограничение на POST. - person chelmertz; 15.02.2010
comment
Отличный момент, @BillyONeal, я добавил это в. @Chelmertz Да, но я могу изменить это, если захочу, и это намного выше. Например, я отправил файлы размером 1 гигабайт в экземпляры Apache. - person ceejayoz; 15.02.2010
comment
Я понимаю, что URL-адреса индексируются поисковыми системами. Я не понимаю, при чем тут GET. Я имею в виду, что URL-адрес - это не просто URL-адрес? - person Honey; 01.11.2016
comment
@Honey Поисковые системы переходят по ссылкам. Ссылки делают запросы GET. Поисковые системы не отправляют формы (в противном случае вы бы видели, как Google регистрирует учетную запись на вашем сайте каждые несколько дней) и, таким образом, не отправляют запросы POST. - person ceejayoz; 01.11.2016
comment
@ceejayoz Хммм. Значит, вы имеете в виду, что ссылка в какой-то мере живая делает запросы GET туда, куда она попадает? И сообщения POST несколько мертвые, пока не нажаты / не отправлены / не заполнены? - person Honey; 01.11.2016
comment
@ Дорогой, я правда не понимаю, что ты пытаешься сказать. GET просит получить что-нибудь. POST просит сделать что-нибудь. Один и тот же URL-адрес может отвечать как на запросы POST, так и на GET, и в зависимости от этого делать разные вещи. Google будет индексировать только найденные URL-адреса GET. Если есть URL-адрес GET в /qpoiweurpiowqueproiuwer.html и на него ничего не ссылается, Google об этом тоже не узнает. - person ceejayoz; 01.11.2016
comment
Я думаю понял. Вы имеете в виду, что Google может обратиться к тому же URL-адресу, который использует GET, но не будет ничего размещать, поскольку он автоматически заполняет формы и, следовательно, тело HTTP? - person Honey; 01.11.2016

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

person Kyle Cronin    schedule 05.09.2008

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

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

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

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

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

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

person davenpcj    schedule 06.09.2008

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

person Gili    schedule 15.02.2010
comment
Не только браузеры рассчитывают на безопасность и идемпотентность GET: пауки поисковых систем и браузеры с предварительной загрузкой (например, Fastfox) также полагаются на это. - person Frank Farmer; 15.02.2010
comment
@gili, наконец-то кто-то дал правильный ответ. Я действительно удивлен, как много людей ошиблись в этом. пальцы вверх! - person lubos hasko; 15.02.2010

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

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

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

person kemiller2002    schedule 05.09.2008
comment
На радио Software Engineering есть отличный подкаст, в котором подробно рассказывается об использовании Get и Post. Где это находится? - person yeeen; 16.02.2010
comment
Вот эта ссылка: se-radio.net / 2008/05 / Episode-98-stefan-tilkov-on-rest Я также редактировал ссылку выше, хотя у меня нет прав на редактирование, и она должна быть рецензирована и т. Д. - person MrBoJangles; 30.06.2011
comment
Предположим, у меня есть конечная точка, которая принимает файл в качестве входных данных, выполняет некоторую обработку файла (пример - извлечение данных на основе регулярного выражения) и возвращает данные JSON, тогда я могу использовать запрос GET для загрузки файла на сервер. Или мне следует использовать POST-запрос? - person variable; 05.12.2019

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

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

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

Используйте POST, если:

    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.

Источник.

person Anagha    schedule 29.08.2013

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

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

person ceejayoz    schedule 05.09.2008

POST может перемещать большие данные, а GET - нет.

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

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

person cherouvim    schedule 15.02.2010

Из RFC 2616:

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


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

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

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

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

person Dmytro    schedule 15.02.2010

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

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

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

person John Boker    schedule 05.09.2008
comment
Почему мы не можем использовать GET для загрузки файлов? - person variable; 05.12.2019

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

person Chris Miller    schedule 05.09.2008

Прочтите статью о HTTP в Википедии. Он объяснит, что это за протокол и для чего он нужен:

ПОЛУЧИТЬ

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

и

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

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

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

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

и

  • Use POST if:
    • The interaction is more like an order, or
    • Взаимодействие изменяет состояние ресурса так, как это будет воспринято пользователем (например, подписка на услугу), или o Пользователь будет нести ответственность за результаты взаимодействия.

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

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

person Gordon    schedule 15.02.2010

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

person jellyfishtree    schedule 15.02.2010

С сайта w3schools.com:

Что такое HTTP?

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

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

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

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

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

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

GET - запрашивает данные из указанного ресурса. POST - отправляет данные для обработки на указанный ресурс.

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

введите описание изображения здесь

person Madhusudhan Reddy    schedule 13.03.2016
comment
Было бы намного лучше, чтобы поисковики и читатели вводили в ответ содержание изображения. Кроме того, первая часть ответа на самом деле не помогает ответить на вопрос. - person Dave Schweisguth; 13.03.2016
comment
Скопируйте вставку из сюда - вы должны правильно процитировать свой источник, и лицензия на источник должна разрешить повторное использование, чего я не думаю, что это делает w3schools. Кроме того, вы действительно думаете, что это добавляет что-то, чего не было в других 25 ответах? - person Benjamin W.; 15.03.2016

Простая версия POST GET PUT DELETE

  • используйте GET - когда вы хотите получить какой-либо ресурс, например список данных на основе любого идентификатора или имени
  • используйте POST - когда вы хотите отправить какие-либо данные на сервер. имейте в виду, что POST - это тяжелая операция, потому что для обновления мы должны использовать PUT вместо POST внутри. POST создаст новый ресурс
  • используйте PUT - когда вы
person Rajesh    schedule 27.11.2015
comment
используйте PUT - когда вы Где остальная часть предложения? - person Pang; 13.11.2018
comment
Замечательно, что кому-то так понравились первые два пункта этого ответа, что они проголосовали за него без последнего пункта, ха-ха: '-) - person pooley1994; 06.06.2020

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

person prodigitalson    schedule 15.02.2010

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

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

person Plynx    schedule 15.02.2010
comment
POST не требует 2 операций http. - person Billy ONeal; 15.02.2010
comment
post-redirect-get требует 2 операции: en.wikipedia.org/wiki/Post/Redirect / Получить - person cherouvim; 15.02.2010
comment
POST может потребовать двух циклических обращений к серверу - обычно выполняется POST с заголовком expect: 100-continue, а затем данные отправляются только после того, как сервер отвечает 100 CONTINUE. - person Frank Farmer; 15.02.2010
comment
Хорошая статья, Cherouvim, я никогда не знал, что у шаблона есть название. - person Plynx; 15.02.2010
comment
@cherouvim: перенаправление сообщений работает, а обычное сообщение - нет. Вы могли бы просто получить перенаправление с теми же результатами. Это не имеет ничего общего с протоколом, который ваша форма использует для отправки. - person Billy ONeal; 15.02.2010
comment
@BillyONeal: да, я согласен, мой комментарий был добавлением информации к вашему. - person cherouvim; 15.02.2010

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

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

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

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

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

person Elizabeth Buckwalter    schedule 15.02.2010

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

person Brian Warshaw    schedule 05.09.2008

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

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

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

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

Типичный пример использования HTTP GET - это поиск, то есть Search? Query = my + query Типичный пример использования HTTP POST - отправка отзыва в онлайн-форму.

person mythz    schedule 15.02.2010