Чем отличаются get и post
Методы GET и POST. Использование и отличия
HTTP методы GET и POST используются для отправки данных на сервер.
Чаще всего методы используются в HTML формах, гиперссылках и AJAX запросах.
POST и GET запросы можно отправить на сервер с помощью любого программного обеспечения, работающего с протоколом HTTP.
Обработка запросов может отличаться в зависимости от типа сервера.
Какой метод использовать GET или POST, чем отличаются методы
Основное отличие метода GET от POST в способе передачи данных.
Запрос GET передает данные в URL в виде пар «имя-значение» (другими словами, через ссылку), а запрос POST передает данные в теле запроса (подробно показано в примерах ниже). Это различие определяет свойства методов и ситуации, подходящие для использования того или иного HTTP метода.
Например, можно использовать метод GET в HTML форме фильтра товаров: когда нужно, исходя из данных введенных пользователем, переправить его на страницу с отфильтрованными товарами, соответствующими его выбору.
HTTP метод POST поддерживает тип кодирования данных multipart/form-data, что позволяет передавать файлы.
Также следует заметить, что методы можно комбинировать. То есть, при необходимости вы можете отправить POST запрос на URL, имеющий GET параметры.
В каких случаях использовать POST и когда нужно использовать GET
В таблице ниже показаны распространенные варианты использования HTTP запросов с объяснением в чем разница между GET и POST запросами в конкретной ситуации.
Ситуация | GET | POST |
---|---|---|
Фильтр товаров | ||
AJAX запросы | Используются оба метода. Выбор зависит от контекста. Принципы выбора метода такие же, как и для HTML форм. |
Сравнительная таблица HTTP методов GET и POST
В таблице ниже приведены основные свойства и отличия GET и POST методов.
Свойство | GET | POST |
---|---|---|
Способ передачи данных | Через URL | В теле HTTP запроса |
Защита данных | ||
Кэширование | Страница с параметрами может быть кэширована | Страница с параметрами не может быть кэширована |
Индексирование поисковыми системами | Страница с параметрами может быть индексирована | Страница с параметрами не может быть индексирована |
Возможность отправки файлов | Не поддерживается | Поддерживается |
Поддерживаемые типы кодирования | application/x-www-form-urlencoded | |
Использование в гиперссылках | Да | Нет |
Использование в HTML формах | Да | Да |
Использование в AJAX запросах | Да | Да |
Пример использования GET запроса
В примере показана простая HTML форма фильтра по нескольким параметрам.
HTML код формы, генерирующей GET запрос:
После отправки формы браузер переведет пользователя по ссылке:
Ссылка содержит URL документа, отвечающего за обработку и блок параметров. Знак «?» отмечает начало блока параметров GET запроса. Далее находятся пары «имя-значение», разделенные знаком «&». Имена параметров отделены от значений знаком «=».
Переход по ссылке, приведенной выше, будет равнозначен отправке формы с указанными параметрами.
Пример использования POST запроса
В примере показана простая HTML форма авторизации.
HTML код формы, генерирующей POST запрос:
После отправки формы браузер переведет пользователя по ссылке:
Для того, чтобы увидеть переданные параметры, воспользуемся инструментами разработчика.
Запрос состоит из области заголовков и тела запроса.
В заголовках указана служебная информация: URL обработчика, тип кодирования, параметры браузера и т.д.
В теле запроса содержатся передаваемые параметры. Формат тела запроса может отличаться в зависимости от выбранного типа кодирования.
Типы HTTP-запросов и философия REST
Этот пост — ответ на вопрос, заданный в комментарии к одной из моих статей.
В статье я хочу рассказать, что же из себя представляют HTTP-методы GET/POST/PUT/DELETE и другие, для чего они были придуманы и как их использовать в соответствии с REST.
Итак, что же представляет из себя один из основных протоколов интернета? Педантов отправлю к RFC2616, а остальным расскажу по-человечески 🙂
Этот протокол описывает взаимодействие между двумя компьютерами (клиентом и сервером), построенное на базе сообщений, называемых запрос (Request) и ответ (Response). Каждое сообщение состоит из трех частей: стартовая строка, заголовки и тело. При этом обязательной является только стартовая строка.
Стартовые строки для запроса и ответа имеют различный формат — нам интересна только стартовая строка запроса, которая выглядит так:
где METHOD — это как раз метод HTTP-запроса, URI — идентификатор ресурса, VERSION — версия протокола (на данный момент актуальна версия 1.1).
Заголовки — это набор пар имя-значение, разделенных двоеточием. В заголовках передается различная служебная информация: кодировка сообщения, название и версия браузера, адрес, с которого пришел клиент (Referrer) и так далее.
Тело сообщения — это, собственно, передаваемые данные. В ответе передаваемыми данными, как правило, является html-страница, которую запросил браузер, а в запросе, например, в теле сообщения передается содержимое файлов, загружаемых на сервер. Но как правило, тело сообщения в запросе вообще отсутствует.
Пример HTTP-взаимодействия
Первая строка — это строка запроса, остальные — заголовки; тело сообщения отсутствует
Ресурсы и методы
Вернемся к стартовой строке запроса и вспомним, что в ней присутствует такой параметр, как URI. Это расшифровывается, как Uniform Resource Identifier — единообразный идентификатор ресурса. Ресурс — это, как правило, файл на сервере (пример URI в данном случае ‘/styles.css’), но вообще ресурсом может являться и какой-либо абстрактный объект (‘/blogs/webdev/’ — указывает на блок «Веб-разработка», а не на конкретный файл).
Тип HTTP-запроса (также называемый HTTP-метод) указывает серверу на то, какое действие мы хотим произвести с ресурсом. Изначально (в начале 90-х) предполагалось, что клиент может хотеть от ресурса только одно — получить его, однако сейчас по протоколу HTTP можно создавать посты, редактировать профиль, удалять сообщения и многое другое. И эти действия сложно объединить термином «получение».
В игру вступает REST
REST (REpresentational State Transfer) — это термин был введен в 2000-м году Роем Филдингом (Roy Fielding) — одним из разработчиков протокола HTTP — в качестве названия группы принципов построения веб-приложений. Вообще REST охватывает более широкую область, нежели HTTP — его можно применять и в других сетях с другими протоколами. REST описывает принципы взаимодействия клиента и сервера, основанные на понятиях «ресурса» и «глагола» (можно понимать их как подлежащее и сказуемое). В случае HTTP ресурс определяется своим URI, а глагол — это HTTP-метод.
REST предлагает отказаться от использования одинаковых URI для разных ресурсов (то есть адреса двух разных статей вроде /index.php?article_id=10 и /index.php?article_id=20 — это не REST-way) и использовать разные HTTP-методы для разных действий. То есть веб-приложение, написанное с использованием REST подхода будет удалять ресурс при обращении к нему с HTTP-методом DELETE (разумеется, это не значит, что надо давать возможность удалить всё и вся, но любой запрос на удаление в приложении должен использовать HTTP-метод DELETE).
REST дает программистам возможность писать стандартизованные и чуть более красивые веб-приложения, чем раньше. Используя REST, URI для добавления нового юзера будет не /user.php?action=create (метод GET/POST), а просто /user.php (метод строго POST).
В итоге, совместив имеющуюся спецификацию HTTP и REST-подход наконец-то обретают смысл различные HTTP-методы. GET — возвращает ресурс, POST — создает новый, PUT — обновляет существующий, DELETE — удаляет.
Проблемы?
Да, есть небольшая проблема с применением REST на практике. Проблема эта называется HTML.
PUT/DELETE запросы можно отправлять посредством XMLHttpRequest, посредством обращения к серверу «вручную» (скажем, через curl или даже через telnet), но нельзя сделать HTML-форму, отправляющую полноценный PUT/DELETE-запрос.
Дело в том, спецификация HTML не позволяет создавать формы, отправляющие данные иначе, чем через GET или POST. Поэтому для нормальной работы с другими методами приходится имитировать их искусственно. Например, в Rack (механизм, на базе которого Ruby взаимодействует с веб-сервером; с применением Rack сделаны Rails, Merb и другие Ruby-фреймворки) в форму можно добавить hidden-поле с именем «_method», а в качестве значения указать название метода (например, «PUT») — в этом случае будет отправлен POST-запрос, но Rack сможет сделать вид, что получил PUT, а не POST.
Блог Vaden Pro
GET или POST? – вот в чем вопрос!
В последнее время в сложившейся практике разработки сайтов наибольшую популярность получили два типа HTTP запросов: GET и POST. Казалось бы ничего сложного в этих двух понятиях нет, но начинающие и неопытные веб-разработчики очень часто допускают непростительные ошибки при выборе определенного метода. Главным образом это происходит по той причине, что эти 2 разные пути могут привести к одному и тому же результату. Ценой неправильного выбора типа запроса может быть угроза безопасности ресурса или информационная перегрузка сервера.
Итак, чтобы не допускать принятие неправильных решений, следует подробнее разобрать суть обоих методов. Это позволит докопаться до истины и вывести веб-разработчика на верный путь.
Очень действенный метод восприятия информации – это ассоциативное мышление, поэтому предлагаю придумать для каждого понятия ассоциацию и связывать функциональные возможности с этим предметом. Обратимся к названиям методов, а точнее к их переводу на русский язык. К примеру, GET переводится, как получать, другими словами получить запрос. А вот POST можно трактовать, пересылка письма по почте. Для программиста это значит, что такой метод будет связан с передачей информации на сервер. Это тот необходимый минимум, который научит новичка не путаться в этих понятиях. Однако, если простые лендинги с формой отправки данных – это для Вас не предел, тогда подойдем в плотную к этому вопросу.
Безопасные и небезопасные HTTP запросы
Изучив спецификацию HTTP 1.1, можно констатировать тот факт, что классификация разновидностей методов запросов насчитывает два типа: безопасный и небезопасный запрос.
Теперь стоит разъяснить суть каждого из методов. Безопасными называются те запросы, которые не имеют никакого влияния на ресурс, они просто запрашивают и помогают считывать информацию. Примером такого запроса является отображение картинки – через ее адрес идет запрос на сервер в указанную директиву, где должен находится файл с картинкой. Такой тип запроса распространяется на методы HEAD и GET.
На заметку
Безопасный метод – это еще не гарантия отсутствия проблем. Ущерб может нанести зацикливание определенного типа запроса, даже если он и безопасный.
Теперь обратимся к понятию небезопасного запроса. Такой метод предусматривает внесение изменений определенным данным на сайте. Наиболее вероятные проблемы возникают в том случае, когда запрос осуществляется повторно или без надобности. В качестве примера следует отметить такие процессы, как онлайн-регистрация, пересылание сообщения или веб-платежи. Пот такой тип запроса относят POST, PUT и DELETE методы.
Идемпотентные методы
Это сложное для восприятия и произношения понятие означает способность некоторых из методов предоставлять одни и те же данные при многочисленных запросах. Та ситуация, когда информация была обновлена, во внимание не берется. Изъясняясь более понятно, это тот случай, когда при запросе файла по одному и тому же адресу будет выводиться постоянно одна и та же информация (например, картинка). Такая способность присуща GET, PUT, DELETE методам.
На этом будем завершать анализ методов. Теперь вы можете убедиться в том, что не совсем POST похож на GET. Поэтому при выборе метода в первую очередь следует проанализировать поставленные цели для ресурса, а затем, исходя из принятых решений, делать выбор. Да, стоит отметить, что по умолчанию работает метод GET.
Для удобности привожу шпаргалку, которая в большинстве случаев направит разработчика на верный путь и позволит принять верное решение:
Хоть и шпаргалка не сможет помочь в специфических и сложных ситуациях, но для решения стандартных задач будет неоценимым помощником.
Чем отличается POST от GET
Если вы занимались какой-либо веб-разработкой, вы, должно быть, встречали эти два термина GET & POST. Эти термины вводятся в отношении тега формы. Объяснение было таким:
«В теге формы есть атрибут, называемый методом. Здесь вы можете указать, каким образом вы хотите отправлять данные на серверную часть. У этого атрибута есть два значения: GET и POST».
GET: если вы используете этот метод, то данные, которые вы записали в форме, будут добавлены к URL-адресу и будут отправлены. Поскольку вводимые пользователем данные чётко видны в URL-адресе, этот метод небезопасен, и существует ограничение на то, что вы можете отправить, и сколько вы можете отправить.
POST: если вы используете POST, данные будут отправлены в теле HTTP-запроса. Его не будет видно в URL-адресе. Нет ограничений на объём отправляемых данных. POST также поддерживает отправку любых данных.
Чем отличается POST от GET
GET: вот код формы GET.
Как и ожидалось, значения параметров появились в URL-адресе. Но если мы воспользуемся инструментом проверки хрома для более подробного анализа, мы сможем увидеть значения, которые представлены в разделе «Параметры строки запроса».
POST: вот код формы POST. Если вы заметили, она идентична нашей форме GET, за исключением значения атрибута method.
Данные отправлены. Но теперь, если мы проверим его с помощью инструментов Chrome, параметры появятся в разделе «Данные формы». GET и POST относятся к семейству HTTP-методов (отсюда и произошло название метода атрибута). Некоторые из методов HTTP: GET, PUT, POST, DELETE, HEAD, PATCH, OPTIONS, TRACE и т.д.
Все они служат нескольким целям протокола HTTP. В этой статье мы в основном сосредоточимся на первых четырёх.
CRUD-операции
Если вы работаете с базами данных, вы, должно быть, встречали эти термины. С точки зрения непрофессионала, я могу объяснить CRUD как базовую функциональность, которая должна предоставляться конечным пользователям через API, чтобы иметь возможность правильно использовать любую систему управления базами данных (в контексте веб-разработки это будет СУБД, которую вы используете вместе со своим сервером. код, скажем MySql, Hibernate и т. д.). CRUD означает CREATE, READ, UPDATE и DELETE. Четыре метода HTTP, как я упоминал ранее, соответствуют одной из этих операций.
Вставить в TABLENAME ЗНАЧЕНИЯ (value1_for_column1, value2_for_column2…);
ВЫБРАТЬ * из ГДЕ столбецX = значениеX И столбецY> значениеY…;
HTTP-метод, соответствующий этой операции, — GET. Попробуйте сравнить это с URL-адресом, сгенерированным после запроса GET, то есть с частью после ’?’ отметьте в URL-адресе выражение после предложения WHERE. Они оба очень похожи, не так ли?
Теперь, если вы подумаете о результатах, которые у нас были ранее, это имеет гораздо больше смысла. Для GET тело запроса было пустым, а значения находились в параметре строки запроса. Поскольку поля формы обрабатывались как параметр запроса, запрашиваемого по URL-адресу «localhost / target.php».
В методе POST данные, введённые в форму, шли вместе с телом запроса. Так оно и появилось в разделе Form Data. Он обрабатывается как некоторые данные, которые пользователь хочет отправить, а не как параметры запроса.
GET и POST: теперь давайте немного вернёмся и подумаем с точки зрения разработчика протокола HTTP. Мы знаем, что GET разработан для использования в случаях, когда пользователь запрашивает список записей. Поля, по которым пользователь выполняет поиск, обычно очень маленькие и текстовые. Таким образом, для запроса GET нет необходимости разрешать что-либо, кроме текстов и всего, что превышает 30 КБ. Скорее, если мы сохраним небольшой размер, задержка обработки будет уменьшена.
Теперь, имея в виду эти вещи, попробуйте подумать о некоторых приложениях, которые вы используете ежедневно, где, по вашему мнению, используется GET. Да! Поисковые системы. Теперь откройте поисковик и попробуйте что-нибудь поискать. Обратите внимание на появившийся URL.
Давайте снова подумаем о разработчиках HTTP. Посредством POST пользователь будет создавать новые записи, для которых потребуется передать большой объём данных. Такой объём данных не может быть передан через URL-адрес, поэтому лучше отправлять их как HTTP-пакеты. Более того, запись может содержать некоторые личные данные, поэтому метод POST должен быть безопасным. Следовательно, POST используется с формами, которые имеют дело с пользовательскими данными (например, с формами Google, когда вы создаёте новую учётную запись на GfG).
С тех пор как я говорил о создании учётной записи, вы можете спросить: «А как насчёт входа в систему? Там никаких новых рекордов не создаётся! Тогда почему GET там не используется?» Хотя можно просто отбросить этот вопрос, сказав, что GET небезопасен, мы не используем его для входа в систему. Но давайте подумаем об этом в контексте, который мы обсуждали до сих пор. При входе в систему вы на самом деле не запрашиваете / не ищете свою запись. Давайте рассмотрим логин с точки зрения поиска. Затем вы передаёте имя пользователя и пароль и спрашиваете систему, есть ли какая-либо учётная запись с этими учётными данными. Это будет очень неправильно. Когда мы авторизуемся, мы запрашиваем у системы разрешение на взаимодействие с нашими данными. По аналогии с банком login будет просить менеджера предоставить нам ключ, который откроет наш шкафчик, во время поиска будет спрашивать, есть ли у человека X шкафчик в этом банке или нет, что опять же очень неправильно и сводит на нет всю цель конфиденциальности. Итак, если вы поставите правильную подпись, менеджер предоставит вам ключ, который откроет шкафчик. В веб-разработке сервер предоставит вам sessionId.
Подведём итоги. При входе в систему, если учётные данные верны, серверная часть создаст для вас сеанс и предоставит идентификатор сеанса. Теперь, используя sessionId, вы можете искать свои данные. Итак, POST подходит для этой ситуации. И, войдя в систему, вы можете использовать запросы GET для извлечения данных.
Заключение
Подводя итог, GET используется для чтения / доступа к некоторым ресурсам, а POST используется для его создания. Я бы посоветовал вам не ограничивать себя мыслительным ресурсом по отношению к СУБД, а подумать об этом в более широком смысле. Ресурс может быть любым, начиная от строки в базе данных и заканчивая файлами, такими как изображения или текст, а иногда даже полными HTML-страницами. Если вы хотите читать / искать ресурс, используйте GET, а если вы хотите создать / добавить / загрузить ресурс, используйте POST.
Post и Get запросы, какая между ними разница и что лучше и для каких целей?
Средний 1 комментарий
Общего между ними то что они работают одинаково. Разницы между ними технически никакой. А вот идеологические различия есть.
Я расскажу о них в контексте PHP. Прошу заметить что протокол HTTP к PHP имеет косвенное отношение потому что он создавался для обмена html страницами а PHP просто расширяет возможности и того и другого.
GET запрос используется чтобы получить данные а POST чтобы отправить. (Напоминаю что технически они работают одинаково).
Чаще всего пост запрос используется в формах (для отправки данных).
Например у нас есть форма для входа 2 поля логин и пароль.
Представим что мы используем GET метод. Тогда при отправке формы мы перейдем на следующий адрес /login.php?login=Андрей&password=123 согласитесь что так передавать такую информацию совсем не безопасно. Любой может открыть ваш браузер и начиная вводить адрес сайта он из истории может увидеть ваши пароли и логины.
А вот если бы мы указали методом POST то мы бы получили следующий запрос:
POST /login.php (login=Андрей&password=123) то что в скобочках было бы скрыто и никак не сохранено в браузере.
Теперь другая ситуация например форма поиска. Мы вводим текст и получаем страницу с результатами. Вот тут уместнее GET форма. потому что нам было бы удобно сразу иметь ссылку на результат поиска, то есть добавить в строку запроса можно выразится «Публичные параметры», которыми можно поделиться. И как результат в строке браузера будет конкретная ссылка на текущую страницу. Мы можем ее скопировать, и разместить где-нибудь, или например скинуть другу. И получить при переходе одну и ту же страницу. А не просить других людей зайти на сайт и в поиск вбить определенную фразу чтобы получить необходимую страницу.