HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке мы рассмотрим особенности отправки форм в HTTP. Формы - это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта. К ним относятся текстовые поля для ввода данных с клавиатуры, списки для выбора предопределенных данных, флажки для установки параметров. Работать будем с локально поднятым сервером, так как со сторонними серверами при тестировании на них наших уроков возникают сложности. В принципе, вы можете поэкспериментировать на любом доступном сервере. Только убедитесь, что он работает по HTTP, а не по HTTPS, так как там взаимодействие происходит немного по-другому и одного telnet будет недостаточно.</p>
1 <p>В этом уроке мы рассмотрим особенности отправки форм в HTTP. Формы - это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта. К ним относятся текстовые поля для ввода данных с клавиатуры, списки для выбора предопределенных данных, флажки для установки параметров. Работать будем с локально поднятым сервером, так как со сторонними серверами при тестировании на них наших уроков возникают сложности. В принципе, вы можете поэкспериментировать на любом доступном сервере. Только убедитесь, что он работает по HTTP, а не по HTTPS, так как там взаимодействие происходит немного по-другому и одного telnet будет недостаточно.</p>
2 <p>При отправке формы мы отправляем какие-то данные. Так как в HTTP не предусмотрены специальные места для отправки данных из форм, они отправляются в теле запроса. При этом в зависимости от того, какой заголовок<em>Content-Type</em>установлен, интерпретируется то, как будут закодированы данные при отправке. Обычно используется следующий формат<em>Content-Type: application/x-www-form-urlencoded</em>. Это простой формат - пары ключ равно значение и амперсанд между ними в качестве разделителя. Если мы хотим отправить несколько пар "ключ-значение", их нужно разделить с помощью амперсанда:</p>
2 <p>При отправке формы мы отправляем какие-то данные. Так как в HTTP не предусмотрены специальные места для отправки данных из форм, они отправляются в теле запроса. При этом в зависимости от того, какой заголовок<em>Content-Type</em>установлен, интерпретируется то, как будут закодированы данные при отправке. Обычно используется следующий формат<em>Content-Type: application/x-www-form-urlencoded</em>. Это простой формат - пары ключ равно значение и амперсанд между ними в качестве разделителя. Если мы хотим отправить несколько пар "ключ-значение", их нужно разделить с помощью амперсанда:</p>
3 <p>Таким нехитрым способом мы можем продолжать строку, передавая столько данных, сколько захотим. Теперь попробуем сделать запрос к нашему локальному серверу.</p>
3 <p>Таким нехитрым способом мы можем продолжать строку, передавая столько данных, сколько захотим. Теперь попробуем сделать запрос к нашему локальному серверу.</p>
4 <p>После отправки сервер, получив те 29 символов, которые мы указали в<em>Content-Length</em>, сразу отправляет нам ответ<em>HTTP/1.1 200 OK</em>, в<em>body</em>которого одно слово Done!. Как видим, в ответе также присутствует<em>Content-Length</em>равный 5.</p>
4 <p>После отправки сервер, получив те 29 символов, которые мы указали в<em>Content-Length</em>, сразу отправляет нам ответ<em>HTTP/1.1 200 OK</em>, в<em>body</em>которого одно слово Done!. Как видим, в ответе также присутствует<em>Content-Length</em>равный 5.</p>
5 <p>Есть еще несколько особенностей, которые нужно знать, когда мы работаем с формами в HTTP. Первая из них связана с кодированием. Поскольку это текстовый формат, то в нем очень легко допустить различные неоднозначности. Предположим в пароле используется знак =.</p>
5 <p>Есть еще несколько особенностей, которые нужно знать, когда мы работаем с формами в HTTP. Первая из них связана с кодированием. Поскольку это текстовый формат, то в нем очень легко допустить различные неоднозначности. Предположим в пароле используется знак =.</p>
6 <p>Каким образом правильно распарсить этот результат? Не исключено, что сервер поймет то, что мы отправляем, так как парсинг происходит слева направо, но это ничем не гарантированно. Более того, в названии поля также могут быть специальные символы. Поэтому все, что отправляется на сервер, должно быть закодировано. Обычно кодированием занимаются браузеры. Но в целом, если вы пишете какие-то скрипты и используемые библиотеки об этом не заботятся, это должны сделать вы. Закодированный символ = выглядит так - %3D и не важно, какой это запрос:<em>POST</em>или<em>GET</em>. Такие закодированные последовательности символов вы можете часто видеть в адресной строке браузера.<em>body</em>с закодированным = приводится в примере ниже:</p>
6 <p>Каким образом правильно распарсить этот результат? Не исключено, что сервер поймет то, что мы отправляем, так как парсинг происходит слева направо, но это ничем не гарантированно. Более того, в названии поля также могут быть специальные символы. Поэтому все, что отправляется на сервер, должно быть закодировано. Обычно кодированием занимаются браузеры. Но в целом, если вы пишете какие-то скрипты и используемые библиотеки об этом не заботятся, это должны сделать вы. Закодированный символ = выглядит так - %3D и не важно, какой это запрос:<em>POST</em>или<em>GET</em>. Такие закодированные последовательности символов вы можете часто видеть в адресной строке браузера.<em>body</em>с закодированным = приводится в примере ниже:</p>
7 <p>Еще одна особенность связана с тем, что иногда нам нужно отправить данные, вложенные друг в друга. Например, массив опций. В таком случае тело может выглядеть так:</p>
7 <p>Еще одна особенность связана с тем, что иногда нам нужно отправить данные, вложенные друг в друга. Например, массив опций. В таком случае тело может выглядеть так:</p>
8 <p>Нюанс в том, что HTTP не умеет работать с такими данными. Их обработкой занимаются мидлвары (англ. middlewares - промежуточное программное обеспечение). Но если вы, например, пишете свою собственную реализацию сервера, вам придется парсить такие данные самостоятельно.</p>
8 <p>Нюанс в том, что HTTP не умеет работать с такими данными. Их обработкой занимаются мидлвары (англ. middlewares - промежуточное программное обеспечение). Но если вы, например, пишете свою собственную реализацию сервера, вам придется парсить такие данные самостоятельно.</p>
9 <h2>Другие способы кодирования</h2>
9 <h2>Другие способы кодирования</h2>
10 <p>Помимо обычного кодирования<em>ключ=значение</em>существуют и другие форматы, но самым популярным является формат JSON. У него достаточно много преимуществ, в числе которых:</p>
10 <p>Помимо обычного кодирования<em>ключ=значение</em>существуют и другие форматы, но самым популярным является формат JSON. У него достаточно много преимуществ, в числе которых:</p>
11 <ul><li>JSON представляет собой строку, что и необходимо при передаче данных по сети</li>
11 <ul><li>JSON представляет собой строку, что и необходимо при передаче данных по сети</li>
12 <li>Не зависит от языка</li>
12 <li>Не зависит от языка</li>
13 <li>С его помощью можно описывать сложные иерархические структуры</li>
13 <li>С его помощью можно описывать сложные иерархические структуры</li>
14 <li>Легко читается человеком</li>
14 <li>Легко читается человеком</li>
15 </ul><p>В данный момент он считается стандартом для обмена информацией между сервисами в интернете. Строка JSON выглядит следующим образом:</p>
15 </ul><p>В данный момент он считается стандартом для обмена информацией между сервисами в интернете. Строка JSON выглядит следующим образом:</p>
16 <p>Для отправки данных в этом формате используется заголовок<em>Content-Type: application/json</em>.</p>
16 <p>Для отправки данных в этом формате используется заголовок<em>Content-Type: application/json</em>.</p>
17 <p>Вот пример такого запроса к нашему серверу:</p>
17 <p>Вот пример такого запроса к нашему серверу:</p>
18  
18