@panem_alba

Отличия GET от POST?

На собеседовании был вопрос "в чем отличие http запроса GET от POST?". Являясь не особо опытным разработчиком, ответил в двух словах, что GET - "открытый" запрос, который отображается в ссылке сайта и используется обычно во всяких фильтрах сайта, а POST - "скрытый" запрос, который никак не отображается визуально и используется для отправки данных с форм и всякого такого.

На что мне ответили "Боюсь вас разочаровать, но это не так. Я могу написать ссылку вида site/?page=2 и отправить её через POST. Так что скажите нам какие есть еще отличия?".

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

Есть ли какая-то информация на этот счёт? И каким образом ссылку site/?page=2 можно отправить методом POST?
  • Вопрос задан
  • 19572 просмотра
Решения вопроса 1
NikFaraday
@NikFaraday
Student full-stack Developer
UPD: пример ниже приведён для MVC архитектуры. API выдаёт данные, а не страницы. HttpGet - это получение информации от сервера. HttpPost - отправка информации на сервер

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

Разница между HttpGet и HttpPost в очень простом виде:
HttpGet - выдача сервером какой-то информации клиенту. Для примера, сервер отдаёт какую-то информацию, допустим, имя и логин пользователя, который зашёл на сайт, для того, что бы отобразить её где-то там. Такая информация передаётся как HttpGet.

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

Стоит отметить, что редирект через url не всегда является httpPost запросом. Если вы просто делаете переадресацию на какую-то страницу и в url передаёте id клиента (Для примера), что бы на странице сведений вывести его данные (Опять же, чисто для примера), это НЕ HttpPost запрос, это просто редирект. Когда вы обращаетесь к серверу с просьбой отрисовать/отрендрить страницу и передаёте туда id клиента, сервер отдаёт HttpGet запрос с разметкой.

Иными словами, HttpGet запрос, это то, когда сервер должен отрисовать новую разметку. Может выполняться несколько запросов, если вы во время регистрации на сайте отправляете данные, делается сначала HttpPost запрос с отправкой ваших данных, а потом HttpGet, когда у вас рендрится новая страница, на которую вас перекинуло.

Так же есть HttpPut - аналогия HttpPost, разницы нету почти никакой. Используется когда нужно обновить информацию. Тот же пример HttpDelete - когда нужно удалить информацию. Грубо говоря, запросы с просьбой обновления или удаления какой-то информации серверу
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
vabka
@vabka Куратор тега Веб-разработка
Токсичный шарпист
Два главных отличия:
1. У GET-запроса нет тела (как правило, но в теории никто не запрещает отправить с телом).
А у POST как правило нет query-параметров, но в принципе никто не запрещает одновременно указать и их, и тело
2. GET-идемпотентный, в отличие от POST.
Если ты отправишь два одинаковых идемпотентных запроса, то ничего не изменится-это безопасно.
И этим свойством пользуются браузеры и всякие прокси, которые в случае каких-то сетевых ошибок тихо отправляют идемпотентные запросы повторно.

Кроме GET есть ещё PUT и DELETE, которые тоже идемпотентные


Есть ли какая-то информация на этот счёт?

Всё это описано в википедии в статье об HTTP


И каким образом ссылку site/?page=2 можно отправить методом POST?

Через curl или через форму
Ответ написан
@stas1212
Технически между двумя этими методами нет никакой разницы, это все на уровне спецификаций - которые "нужно" соблюдать, но мало кто соблюдает. Фактически же эти спецификации будут использоваться только при проксировании - тоесть если вы используете прокси сервер - то в случае неисполнения запроса типо Get - сервер его повторит( так метод Get идемпотентный).
Про тело запроса - оно может и в Get - ничего этому не мешает.

В реальном мире тот же самый Post очень часто используется для получения информации сервера ,а не для записи,происходит это тогда,когда в теле запроса нужно передать какой то объект( например какой то сложный фильтр) и выбирают меньшее из зол - Get с телом хуже чем идемпотентый Post- но если стоит прокси - в случае неудачи такой пост запрос не будет повторен

Суммируя - есть некая договоренность ,желательно ее соблюдать - но если нет - ничего не случится ))
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега Веб-разработка
♬♬
Общение веб-браузера c сервером по протоколу HTTP напоминает обычный текстовый чат. Никакой магии.

Браузер устанавливает соединение с сервером и пишет ему текстом, как будто, «Привет, как дела».
Веб сервер в ответ что-то возвращает, типа «Ничего так, пойдёт».

Настоящий диалог строго регламентирован протоколом. Первая строчка, которую должен прислать браузер содержит название метода, адрес и версию протокола:GET /about/index.html HTTP/1.1

Ну, или POST /guestbook HTTP/1.1. Или ещё какой-то из методов и адресов.

Вы можете подключиться к веб-серверу обычным telnet'ом по 80-му порту, если найдёте веб-сервер, позволяющий подключаться без SSL (без https://), и попробовать вообще вручную вводить все эти строки, изображая браузер.

Таким образом, различие методов GET и POST — целиком зависит от веб-сервера. Существует стандарт, описывающий все ньюансы. Рекомендации, которых лучше придерживаться. Но в конечном счёте это всего лишь чат )
Ответ написан
Комментировать
xPomaHx
@xPomaHx
1vs9
Первым словом в первой строчке запроса, а остальные отличия это детали конкретных реализаций.
Ответ написан
Комментировать
Первая же ссылка из гугла всё прекрасно описывает
https://htmlacademy.ru/blog/best/get-vs-post
Ответ написан
Комментировать
@avivasyuta
Дополню, что GET запросы кешируются. POST - нет
Ответ написан
Комментировать
@Vitsliputsli
"Боюсь вас разочаровать, но это не так. Я могу написать ссылку вида site/?page=2 и отправить её через POST. Так что скажите нам какие есть еще отличия?".

Вы не найдете правильный ответ. Если бы собеседующий хотел проверить ваши знания, он бы уточнял вопрос, показывая о чем конкретно он хочет спросить. Но больше похоже на игру "я вот знаю, а ты нет". Нормальный человек обычно объяснит, что он имел ввиду.
Потому что, на такое замечание можно ответить только, что сделать можно что угодно, можно хоть вместо метода GET использовать метод в виде неприличного слова. А если его будут знать и клиент и сервер, то все будет отлично работать.
Поэтому это вопрос больше про договоренности, а если вопрошающий заявляет что ему пофиг на них, то угадать что для него важно, а что нет - очень сложно.
Например, avivasyuta вспомнил еще один интересный момент - кеширование браузером. Кто знает, может быть имелось ввиду оно, но и это ведь тоже договоренности.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы