|
||||||||||||||||||||||||||||||||||||||
|
Учимся работать с GET и POST запросами. Как отправить пост запрос из браузераhttp - Как параметры отправляются в HTTP-запрос POST?Короткий ответ: в POST-запросах, значения отправляются в "теге" запроса. С веб-формами они, скорее всего, отправляются с типом носителя application/x-www-form-urlencoded или multipart/form-data. Языки программирования или фреймворки, предназначенные для обработки веб-запросов, обычно выполняют "The Right Thing ™" с такими запросами и обеспечивают вам легкий доступ к легко декодированным значениям (например, $_REQUEST или $_POST в PHP или cgi.FieldStorage(), flask.request.form в Python). Теперь отпустите немного, что может помочь понять разницу;) Разница между запросами GET и POST в значительной степени семантична. Они также "используются" по-разному, что объясняет разницу в том, как передаются значения. При выполнении запроса GET вы запрашиваете сервер для одного или набор объектов. Чтобы клиент мог фильтровать результат, он может использовать так называемую "строку запроса" URL-адреса. Строка запроса - это часть после ?. Это часть синтаксиса URI . Итак, с точки зрения вашего кода приложения (части, которая получает запрос) вам нужно будет проверить часть запроса URI, чтобы получить доступ к этим значениям. Обратите внимание, что ключи и значения являются частью URI. Браузеры могут налагать ограничение на длину URI. В стандарте HTTP указано, что ограничений нет. Но на момент написания этой статьи большинство браузеров ограничивают URI (у меня нет конкретных значений). GET запросы никогда не должны использоваться для отправки новой информации на сервер. Особенно не крупные документы. Это где вы должны использовать POST или PUT. При выполнении запроса POST клиент фактически отправляет новый документ удаленному хосту. Таким образом, строка запроса не (семантически) имеет смысл. Вот почему у вас нет доступа к ним в вашем коде приложения. POST немного сложнее (и более гибким): При получении запроса POST вы всегда должны ожидать "полезную нагрузку" или в терминах HTTP: тело сообщения. Тело сообщения само по себе довольно бесполезно, поскольку нет стандартного (насколько я могу судить. Может быть, application/octet-stream?) Формата. Формат тела определяется заголовком Content-Type. При использовании элемента HTML FORM с method="POST" это обычно application/x-www-form-urlencoded. Другим очень распространенным типом является multipart/form-data, если вы используете загрузку файлов. Но может быть что угодно: от text/plain, более application/json или даже пользовательского application/octet-stream. В любом случае, если запрос POST выполняется с Content-Type, который не может быть обработан приложением, он должен вернуть 415 статус-код. Большинство языков программирования (и/или веб-фреймворки) предлагают способ де-кодирования тела сообщения от/до наиболее распространенных типов (например, application/x-www-form-urlencoded, multipart/form-data или application/json). Так просто. Пользовательские типы требуют потенциально немного больше работы. Используя стандартный HTML-документ, закодированный в качестве примера, приложение должно выполнить следующие шаги:
Опять же, такие языки, как PHP, или веб-фреймворки для других популярных языков, вероятно, справятся с этим для вас. Исключением является ошибка 415. Никакая структура не может предсказать, какие типы контента ваше приложение выбирает для поддержки и/или не поддержки. Это зависит от вас. A PUT запрос в значительной степени обрабатывается точно так же, как запрос POST. Большая разница заключается в том, что запрос POST должен позволить серверу решить, как (и если вообще) создать новый ресурс. Исторически (из теперь устаревшего RFC2616 он должен был создать новый ресурс как "подчиненный" (дочерний) URI, куда был отправлен запрос). A PUT запрос, напротив, должен "откладывать" ресурс именно в этом URI и именно с этим контентом. Не больше, не меньше. Идея заключается в том, что клиент несет ответственность за создание полного ресурса до "PUTting". Сервер должен принять его как есть на заданном URL. Как следствие, запрос POST обычно не используется для замены существующего ресурса. Запрос PUT может создавать и заменять. Также есть " параметры пути", которые могут использоваться для отправки дополнительных данных на пульт, но они настолько необычны, что я выиграл Здесь не слишком подробно. Но, для справки, вот отрывок из RFC: Помимо точечных сегментов в иерархических путях рассматривается сегмент пути непрозрачный по обобщенному синтаксису. URI-приложения часто используют зарезервированные символы, разрешенные в сегменте для разграничения схемы или подкомпоненты, специфичные для разыменования. Например, точка с запятой ( ";" ) и equals ( "=" ) зарезервированные символы часто используются для разграничения параметров и значения параметров, применимые к этому сегменту. Запятая ( "," ) зарезервирована характер часто используется для аналогичных целей. Например, один производитель URI может использовать сегмент, такой как "name; v = 1.1", чтобы указать ссылку на версию 1.1 "name", тогда как другой может использовать сегмент, такой как "name, 1.1" to указывают на то же самое. Типы параметров могут определяться по схеме семантика, но в большинстве случаев синтаксис параметра специфичен для реализация алгоритма разыменования URI. qaru.site Учимся работать с GET и POST запросами ::: Блог RSGET запросВы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса: http://rio-shaman.ru/index.php?blog=2Тут, даже не зная php, можно догадаться, что мы обращаемся к файлу index.php Но то, что идет после знака вопроса, мало кто знает. Все довольно просто: ?blog=2 это объявление глобальной переменной «$_GET['blog']» с значением «2». Таким образом я в скрипт передаю переменную которая отвечает за вывод информации из базы данных. Давайте напишем небольшой скрипт в котором Вы все наглядно увидите: <?phpif(isset($_GET['blog'])) {echo $_GET['blog'];}?>Мы используем оператор условий if() в качестве условия стоит вот такая строчка: isset() позволяет узнать существует ли переменная которая указана в скобках, то есть условие которое я описал в коде звучит так: Если существует переменная $_GET['blog'] то вывести содержимое этой переменной на экран. Вот что получилось: Думаю понятно Теперь хочу пояснить один момент. Предположим нам необходимо объявить две переменные, как это сделать? Первая переменная объявляется после знака вопроса «?» Вторая же переменная объявляется после такого знака «&» (Если честно не знаю что это за знак ), вот пример объявление трех переменных: http://rio-shaman.ru/index.php?a=1&b=2&c=3Вот код вывода: <?phpif(isset($_GET['a']) AND isset($_GET['b']) AND isset($_GET['c']) ) {echo $_GET['a']."<br>";echo $_GET['b']."<br>";echo $_GET['c']."<br>";}?>Условие звучит так: Если существует глобальная переменная $_GET['a'] и глобальная переменная $_GET['b'] и глобальная переменная $_GET['с'] то вывести их на экран, вот результат: ФормыПрежде чем мы перейдем к post запросам, необходимо разобрать, что такое формы? Почему нужно? Потому что глобальная переменная $_POST[''] создается именно через формы. Что такое форма? Это поля для ввода какой-нить информации пользователем. Поля бывают в одну строчку, большие поля, так же бывают радио кнопочки, чек боксы. Разберем все по порядку... Форма это тег: <form>элементы формы</form>У формы есть атрибуты, перечислю самые распространенные:
Давайте создадим форму: <form action="test.php" method="post" name="form">элементы формы</form>В качестве файла обработчика я поставил файл test.php так как именно в нем пишу для Вас примеры. Метод отправки я поставил post так как именно этим методам пользуются в 99.9% случаях. Так же я присвоил нашей форме имя — form Теперь окунемся в мир элементов формы. Первым делом Вы должны понять, что почти все элементы являются тегом <input> отличие лишь в атрибуте type у этих тегов. Давайте я перечислю используемые элементы форм: Я уверен, что вы не раз встречали такие поля, так что тут как говорится: «no comments» Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось: <form action="test.php" method="post" name="form">Ваше Фамилия Имя Отчество: <input name="fio" type="text" value=""><br><br> Ваш пол: М<input name="sex" type="radio" value="Мужской">Ж<input name="sex" type="radio" value="Женский"><br><br> Из какой Вы страны <select name="city"><option value="Россия"> Россия<option value="Другая страна"> Другая страна</select><br><br> Любимый(ые) цвет(а): <br><br> Черный: <input type="checkbox" name="color_1" value="Черный">Красный: <input type="checkbox" name="color_2" value="Красный">Белый: <input type="checkbox" name="color_3" value="Белый">Другой: <input type="checkbox" name="color_4" value="Другой"><br><br> О себе:<br><br><textarea cols="40" rows="10" name="about"></textarea><br><br> <input type="submit" name="submit"> </form>
Обратите внимание, что почти у каждого тега есть атрибут value, для чего он? В него записываются данные которые Вы собираетесь перенести на другую страницу. Надеюсь понятно Теперь если запустить этот код в браузере, то мы увидим следующее: У формы я использовал атрибут action со значением test.php это означает, как я уже говорил, что данные из формы передадутся в файл test.php. POST запросТеперь напишем php код который позволит нам увидеть введенную нами информацию. Где хранятся данные? В случае с get запросом, наши данные лежали в глобальной переменной $_GET['']. При post запросе, данные будут лежать в глобальной переменной $_POST['']. В квадратных скобках, необходимо прописывать, как и в случае с глобальной переменной get, идентификатор. Вопрос, где этот идентификатор взять? Вот для чего нам необходим атрибут name у элементов форм! Именно эти имена и служат нам ключом в глобальном массиве post. Ну что ж, приступим к описанию скрипта: <?phpif(isset($_POST['submit'])) {echo "ФИО: ".$_POST['fio']."<br>";echo "Пол: ".$_POST['sex']."<br>";echo "Страна проживания: ".$_POST['city']."<br>";echo "Любимый(ые) цвет(а): <br>";echo $_POST['color_1']."<br>";echo $_POST['color_2']."<br>";echo $_POST['color_3']."<br>";echo $_POST['color_4']."<br>";echo "О себе: ".$_POST['about']."<br><br><br>"; }?> Написанное нами условие if гласит: Если существует глобальная переменная $_POST['submit'] то выводим данные на экран. Эта глобальная переменная создается в случае если мы нажали на кнопку отправки, вот для чего в данном примере необходим атрибут name в кнопке. Вы вполне можете задаться вопросом, почему же у кнопки атрибут name не обязательный? Все довольно просто. Обычно программист не отслеживает нажатие кнопки, а отслеживает посланные данные. Для корректной работы, например формы контактов, необходимо отследить не нажатие кнопки, а правильность ввода информации, и узнать вводили ли эту информацию вообще. В нашем же примере мы не проверяли посланные данные, а просто отследили нажатие кнопки, для упрощение примера... Вот что у нас получилось: ЗаключениеНу что ж, за сегодня мы разобрали два метода передачи данных между скриптами, так же галопам познакомились с формами. Очень надеюсь, что эта информация Вам хоть где то пригодится. Если есть какие вопросы, или мысли, пишите комментарии. Удачи Вам, на сегодня у меня все! rio-shaman.ru Как работает браузер: HTTP запросАвтор: Евгений Рыжков Дата публикации: 18.10.2010 В предыдущей статье рассмотрели схемы обмена данными между браузером и сервером с помощью HTTP протокола и его запросов. Теперь познакомимся ближе с самим HTTP запросом. Структура HTTP запросаКаждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:
Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом. Например, строка запроса может выглядеть так: GET http://www.xiper.net/ HTTP/1.1Остановимся более подробно на методах запроса. Методы HTTPМетод указывает какая операция будет производится над ресурсом, представляет собой короткое английское слово, записанное заглавными буквами. Название метода чувствительно к регистру. В спецификации HTTP 1.1 определены следующие методы: OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, LINK, UNLINK. Чтобы не перегружать мозг избыточной информацией рассмотрим используемые чаще всего. Метод GETGET — используется для запроса содержимого указанного ресурса. Это с его помощью браузер получает HTML код конкретной страницы и все ее объекты (изображения, CSS и т.п). Тело такого запроса является пустым. Ответ может кэшироваться. GET запрос может передать параметры на сервер для уточнения запрашиваемых данных. Параметры запроса содержаться в адресе запроса, отделяются от URI знаком «?», пары параметр-значение разделяются символом «&». Подобный адрес запроса может выглядеть так: http://www.domain-name.com?param1=value1¶m2=value2Кроме обычных GET запросов, есть еще условные и частичные. Условный GETУсловный GET запрос (conditional GET) предназначен для уменьшения ненужной загрузки сети, и позволяет обновлять кэшированные объекты без пересылки данных, уже сохраненных клиентом. Условный GET содержит в своем заголовке определенные условия и данные получает от сервера, только если ответ удовлетворяет запрашиваемым условиям. Спецификацией HTTP 1.1 определены условия: If-Modified-Since, If-Match, If-None-Match, If-Range. Наиболее часто ныне используется If-Modified-Since, которым задается дата и время последнего изменения объекта. При последующем обращении к данному ресурсу, браузер проверит значение этого заголовка, если он не изменился, объект возьмется из кэша клиента. Частичный GETЧастичный GET запрос (partial GET) предназначен для уменьшения ненужной загрузки сети. Позволяет собирать объект из частей без передачи данных уже имеющихся на стороне клиента и потому запрашивает передачу только части объекта. Используется заголовок Range. Метод POSTPOST предназначен для передачи данных на сервер. Тело такого запроса обычно содержит данные. Сообщение ответа сервера на выполнение метода POST не кэшируется. Этот метод второй по популярности использования, в основном его применяют в веб формах для получения каких-то данных от пользователей ресурса (формы входа, регистрации, отправка сообщений и т.п.). ЗаметкаHTTP запросы можно разделить на безопасные (когда пользователь просто запрашивает данные и не может повлиять на работу сервера) и небезопасные (когда пользователь отправляет серверу определенные данные и потенциально может повлиять на его работу). URI и версия протоколаURI — это последовательность символов (строка), идентифицирующая абстрактный или физический ресурс. Версия протокола служит для указания, с какой версией протокола способен работать клиент/сервер и выглядит в виде HTTP/[версия]. Сейчас большинство поддерживают версию 1.1. Каждый запрос имеет как минимум свой заголовок, который сообщить серверу информацию о своей конфигурации и данные о форматах документов, которые он может принимать. Заголовок представлен в текстовом виде. Например: GET / HTTP/1.1 Host: www.google.com.ua User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 GTB7.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Cookie: PREF=ID=2578ccacb1ecf2aa:U=3a0a80ae418769c4:TM=1264579766:LM=1284111039:DV=sTIUytipGDoC:S=N0XC7wB0v7c6CCnH;Такой заголовок имеет вес равный 956b. Каждый ответ состоит из трех частей: строка состояния (содержит три поля: версию HTTP, код состояния и описание), заголовок ответа (информация о сервере и передаваемых данных) и сами данные. Первые две части представлены тоже в текстовом виде и выглядит это примерно так: Request URL:http://ksayri.info/ Request Method:GET Status Code:200 OK Accept-Ranges:bytes Connection:close Content-Encoding:gzip Content-Length:2553 Content-Type:text/html Date:Fri, 08 Oct 2010 08:35:53 GMT ETag:"9cb33-1638-490d5608b0540" Last-Modified:Wed, 22 Sep 2010 09:00:29 GMT Server:Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch Vary:Accept-EncodingТолько первые две части в особо тяжелых случаях могут весить 0.5 килобайт. Это все к тому, что твой дополнительный однопиксельный gif на веб странице весом всего лишь 43 байта может вылиться в 130 с лишним мегабайт трафика при всего лишь 100 000 посетителях. Это еще одна причина для чего лучше сокращать число отдельных запросов к серверу. ЗаметкаВес передаваемых данных не влияет на размер заголовка. Установка HTTP заголовковДобраться до этих заголовков можно только с помощью настроек сервера и/или серверными скриптами. При первом запросе браузером объекта (HTML страницы, картинки или любого другого) сервер присылает ответ, содержащий HTTP заголовки. Клиент их сохраняет вместе с адресом запроса. При повтором обращении по этому адресу браузер уже будет снабжен необходимыми заголовками. Тело HTTP заголовкаПока не нашел информации по этой части запроса, которая была бы полезной HTML кодеру, поэтому в этой статье рассматривать ее не буду. По темеМатериалыxiper.net |
|
||||||||||||||||||||||||||||||||||||
|
|