Что такое сайт? По сути, это набор URL, за каждым из которых на стороне сервера стоит некоторый "исполнитель", который в ответ на запрос совершает на сервере определенные действия и возвращает вам какой-то ответ (html-страницу, изображение и т. д.).
Взаимодействие пользователя с сайтом, как вы знаете, осуществляется по протоколу HTTP. Задачей этого протокола является обеспечение возможности обмена данными между клиентом и сервером. Осуществить этот обмен можно различными методами, основными из которых являются методы GET и POST. Эти методы по сути используются для одной и той же цели, однако, делают это совершенно разными способами. В чем же разница между ними?
Когда вы вводите какой-нибудь адрес в адресной строке и нажимаете Enter - вы тем самым инициируете GET запрос к серверу, на котором находится затребованный вами сайт. Сервер, получив этот запрос, направляет его соответствующей функции обработки и возвращает вам результат (обычно html страницу). Параметром GET-запроса является URL ресурса, к которому вы хотите обратиться. Например:
http://www.itsin.ru
Такой запрос по сути обезличен, в смысле что вы просто просите сервер отдать вам конкретную страницу сайта. Любой другой человек, сделав этот запрос, получит тот же самый результат в ответ. В случае же если вы или владелец сайта хотите чтобы в ответ вы получили персонифицированную страницу (например, чтобы появилась не главная страница сайта, а ваш личный кабинет), то вам необходимо передать вместе с запросом дополнительную, уточняющую информацию. Для передачи дополнительной информации существует два способа - общий для протокола HTTP и специфичный для конкретного метода (GET или POST).
В случае с общим способом - это использование Cookie. Cookie представляет собой специальное поле в заголовках запроса, внутри которого можно поместить произвольную информацию в виде строки. Максимальный размер допустимых данных составляет 4КБ.
Специфичной для метода GET является возможность передачи информации прямо в URL. Для этого после URL ресурса добавляется специальный символ "?", после которого идут пары ключ=значение, разделенные символом "&". Например:
http://www.itsin.ru?type=post&id=123
Сервер по-прежнему получает запрос на ту же страницу (http://www.itsin.ru) однако теперь помимо затребованного ресурса он получил еще и дополнительную информацию - параметр type со значением "post" и параметр id со значением "123".
Таким образом, с помощью запроса GET можно передавать информацию прямо в URL ресурса. Однако существует ограничение на максимальную длину URL и соответственно на максимально допустимый объем передаваемой информации. Ограничение это проявляется с двух сторон: со стороны принимающего сервера и со стороны браузеров.
Веб-сервера по умолчанию обычно ограничивают длину GET запроса равной 8 КБ. Однако этот параметр может быть изменен администратором этого сервера. Касательно браузеров примерные ограничения следующие:
(источники: http://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request, http://wiert.me/2010/04/20/maximum-url-lengths/ )
Таким образом для сервиса, предназначенного для массового рынка, следует исходить из того что максимальный размер GET запроса не должен превышать 2048 B (упираемся в возможности Internet Explorer).
Согласно спецификации HTTP, метод GET является идемпотентным, что означает, что при одинаковых запросах будет получен одинаковый результат. Это обстоятельство довольно сильно может испортить жизнь разработчику при отладке в IE, так как IE в этом смысле действует весьма добросовестно по отношению к спецификации и исходя из идемпотентности кеширует GET запросы, которые совершаются в фоне (AJAX). Как можно догадаться, такое поведение является не совсем ожидаемым. Стандартным решением в данной ситуации является добавление в GET запрос дополнительного параметра, значением которого является текущее время в миллисекундах:
http://www.itsin.ru?type=post&id=123&ignoreme=666774
Благодаря этому каждый запрос будет отличаться от предыдущего, что и решает проблему с кешированием. Текущее время можно получить при помощи следующего javascript кода:
var currentTime = new Date().getTime();
У остальных браузеров подобной проблемы не наблюдается.
Метод POST также обладает специфичным способом передачи данных от клиента к серверу. С данным методом вы сталкиваетесь каждый раз, когда загружаете файлы или изображения на какой-нибудь сайт. Связано это с тем, что метод POST не имеет столь жестких ограничений (как метод GET) на размер передаваемых данных, так как данные передаются не вместе с URL, а уже в теле запроса. Благодаря этому методом POST можно передавать файлы весьма внушительного размера. Фактически объем передаваемых через метод POST данных ограничен лишь настройками принимающего сервера. Обычно по умолчанию данное ограничение составляет 10 МБ.
Из-за того что данные передаются внутри тела запроса, пользователь явно не увидит какие именно данные передаются, как в случае с методом GET, когда передаваемые данные отображаются в адресной строке.
Подытожим, выделив отличия методов GET и POST:
Передают данные URL, в следствии чего явно виден пользователю в адресной строке. Идемпотентен. Может кешироваться браузером (IE). Имеет жесткое ограничение на размер передаваемых данных (рекомендуется рассматривать как 2 КБ)
Передает данные в теле запроса. В следствии чего не виден пользователю. Не имеет жесткого ограничения на размер передаваемых данных. Не кешируется. Вопрос "какой метод использовать?" или "почему не использовать всегда метод POST раз он лишен недостатков GET?" - спорный. Все зависит от конкретной ситуации.
Например, в рассмотренном в прошлой статье "Политика безопасности браузеров" примере работы Google Analitics описывалось, как с помощью GET запроса однопиксельного изображения GA передает данные на сервера Google. В данной ситуации метод POST использовать просто не получится, так как тег <img> запрашивает изображение методом GET.