Общего между ними то что они работают одинаково. Разницы между ними технически никакой. А вот идеологические различия есть.
Я расскажу о них в контексте PHP. Прошу заметить что протокол HTTPએ к PHPએ имеет косвенное отношение потому что он создавался для обмена html страницам а PHP просто расширяет возможности и того и другого.
GET
запрос используется чтобы получить данные, а POST
чтобы отправить. (Напоминаю что технически они работают одинаково).
Поэтому в контексте PHP опираясь на эту идеологию сделали следующим образом:
- При каждом запуске PHP по умолчанию создаются суперглобальные массивы (
$_GET
,$_POST
). - Если в строке запроса есть вопросительный знак(
?
). То все что после него считается параметрами GET запроса они представлены в формате'ключ'='значение'
и в качестве разделителя используется знак амперсанда (&
)
Пример:
GET /index.php?name=Андрей&surname=Галкин
это строка запроса, тут 2 параметра. эти параметры попадут в массив$_GET
. $_POST
заполняется другим способом. содержимое этого массива заполняется из "заголовков запроса". То есть из места, скрытого от глаз в явном виде. Всю рутину по созданию таких заголовков берет на себя браузер. Хотя иногда и что-то редактируется в заголовках в ручную.
Чаще всего пост запрос используется в формах (для отправки данных).
Например у нас есть форма для входа 2 поля логин и пароль.
Представим что мы используем GET метод. Тогда при отправке формы мы перейдем на следующий адрес /login.php?login=Андрей&password=123
согласитесь что так передавать такую информацию совсем не безопасно. Любой может открыть ваш браузер и начиная вводить адрес сайта он из истории может увидеть ваши пароли и логины.
А вот если бы мы указали методом POST то мы бы получили следующий запрос:
POST /login.php
(login=Андрей&password=123) то что в скобочках было бы скрыто и никак не сохранено в браузере.
Теперь другая ситуация например форма поиска. Мы вводим текст и получаем страницу с результатами. Вот тут уместнее GET форма. потому что нам было бы удобно сразу иметь ссылку на результат поиска, то есть добавить в строку запроса можно выразится "Публичные параметры", которыми можно поделиться. И как результат в строке браузера будет конкретная ссылка на текущую страницу. Мы можем ее скопировать, и разместить где-нибудь, или например скинуть другу. И получить при переходе одну и ту же страницу. А не просить других людей зайти на сайт и в поиск вбить определенную фразу чтобы получить необходимую страницу.
В общем, подводя итог:
GET
— это чтобы получить определенную страницу в определенном виде ( сортировка, текущая страница в блоге, строка поиска и т.п. ).
POST
— для оправки данных которые не влияют на отображение страницы, в том плане что эти данные влияют только на результат выполнения скрипта (логины, пароли, номера кредиток, сообщения и т.п.).
И еще одна хорошая новость их можно комбинировать, например, POST /index.php?page=login
(login=Андрей&password=123) Думаю я уже достаточно объяснил что из этого получится и какие параметры в какой массив попадут.