Отправка форм | Протокол HTTP
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
В этом уроке мы рассмотрим особенности отправки форм в HTTP. Формы — это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта. К ним относятся текстовые поля для ввода данных с клавиатуры, списки для выбора предопределенных данных, флажки для установки параметров. Работать будем с локально поднятым сервером, так как со сторонними серверами при тестировании на них наших уроков возникают сложности. В принципе, вы можете поэкспериментировать на любом доступном сервере. Только убедитесь, что он работает по HTTP, а не по HTTPS, так как там взаимодействие происходит немного по-другому и одного telnet будет недостаточно.
При отправке формы мы отправляем какие-то данные. Так как в HTTP не предусмотрены специальные места для отправки данных из форм, они отправляются в теле запроса. При этом в зависимости от того, какой заголовок Content-Type установлен, интерпретируется то, как будут закодированы данные при отправке.
login=smith&password=12345678
Таким нехитрым способом мы можем продолжать строку, передавая столько данных, сколько захотим. Теперь попробуем сделать запрос к нашему локальному серверу.
telnet localhost 8080 POST /login HTTP/1.1 Host: hexlettesthost.com Content-Type: application/x-www-form-urlencoded Content-Length: 29 login=smith&password=12345678 # отправляем данные HTTP/1.1 200 OK X-Powered-By: Express Connection: close Content-Type: text/html; charset=utf-8 Content-Length: 7 ETag: W/"c-r0WEeVxJ7IpMIG20rN7HX9ndB4c" Date: Thu, 09 Jul 2020 03:32:54 GMT Done! Connection closed by foreign host.
После отправки сервер, получив те 29 символов, которые мы указали в Content-Length, сразу отправляет нам ответ HTTP/1.1 200 OK, в body которого одно слово Done!
. Как видим, в ответе также присутствует Content-Length равный 7
.
Есть еще несколько особенностей, которые нужно знать, когда мы работаем с формами в HTTP. Первая из них связана с кодированием. Поскольку это текстовый формат, то в нем очень легко допустить различные неоднозначности. Предположим в пароле используется знак =
.
login=smith&password=1234=5678
Каким образом правильно распарсить этот результат? Не исключено, что сервер поймет то, что мы отправляем, так как парсинг происходит слева направо, но это ничем не гарантированно. Более того, в названии поля также могут быть специальные символы. Поэтому все, что отправляется на сервер, должно быть закодировано. Обычно кодированием занимаются браузеры. Но в целом, если вы пишете какие-то скрипты и используемые библиотеки об этом не заботятся, это должны сделать вы. Закодированный символ
выглядит так — %3D
и не важно, какой это запрос: POST или GET. Такие закодированные последовательности символов вы можете часто видеть в адресной строке браузера. body с закодированным =
приводится в примере ниже:
login=smith&password=1234%3D5678
Еще одна особенность связана с тем, что иногда нам нужно отправить данные, вложенные друг в друга. Например, массив опций. В таком случае тело может выглядеть так:
user[login]=smith&user[password]=12345678
Нюанс в том, что HTTP не умеет работать с такими данными. Их обработкой занимаются мидлвары (англ. middlewares — промежуточное программное обеспечение). Но если вы, например, пишете свою собственную реализацию сервера, вам придется парсить такие данные самостоятельно.
Помимо обычного кодирования ключ=значение существуют и другие форматы, но самым популярным является формат JSON. У него достаточно много преимуществ, в числе которых:
- JSON представляет собой строку, что и необходимо при передаче данных по сети
- Не зависит от языка
- С его помощью можно описывать сложные иерархические структуры
- Легко читается человеком
В данный момент он считается стандартом для обмена информацией между сервисами в интернете. Строка JSON выглядит следующим образом:
{ "firstName": "John", "lastName": "Smith", "children": [ { "firstName": "Max", "lastName": "Smith" }, { "firstName": "Annie", "lastName": "Smith" } ] }
forms — type — В чем разница между формами данных, x-www-form-urlencoded и raw в приложении Postman Chrome?
многочастному / форм-данных ,
Заметка. Обратитесь к [RFC2388] за дополнительной информацией о загрузке файлов, включая проблемы обратной совместимости, взаимосвязь между «multipart / form-data» и другими типами контента, проблемами производительности и т. Д.
Пожалуйста, обратитесь к приложению для получения информации о проблемах безопасности для форм.
Тип контента «application / x-www-form-urlencoded» неэффективен для отправки больших количеств двоичных данных или текста, содержащих символы, отличные от ASCII. Тип контента «multipart / form-data» должен использоваться для отправки форм, содержащих файлы, данные, отличные от ASCII, и двоичные данные.
Содержимое «multipart / form-data» соответствует правилам всех потоков данных MIME, как описано в [RFC2045]. Определение «multipart / form-data» доступно в реестре [IANA].
Сообщение «multipart / form-data» содержит ряд частей, каждый из которых представляет собой успешный элемент управления. Части отправляются агенту обработки в том же порядке, что и соответствующие элементы управления отображаются в потоке документа. Границы частей не должны встречаться ни в одной из данных; как это делается, выходит за рамки этой спецификации.
Как и во всех многопользовательских типах MIME, каждая часть имеет дополнительный заголовок «Content-Type», по умолчанию «text / plain». Пользовательские агенты должны поставлять заголовок «Content-Type», сопровождаемый параметром «charset».
применение / х-WWW-форм-urlencoded
Это тип содержимого по умолчанию. Формы, представленные с этим типом контента, должны быть закодированы следующим образом:
Управляющие имена и значения экранируются.
+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by
% HH’, знак процента и две шестнадцатеричные цифры, представляющие код ASCII символа. Разрывы строк представлены как пары «CR LF» (т. %0D%0A'). The control names/values are listed in the order they appear in the document. The name is separated from the value by
%0D%0A'). The control names/values are listed in the order they appear in the document. The name is separated from the value by
%0D%0A'). The control names/values are listed in the order they appear in the document. The name is separated from the value by
= ‘, а пары имя / значение отделены друг от друга символом `&’. application/x-www-form-urlencoded
тело HTTP-сообщения, отправленного на сервер, по существу является одной гигантской строкой запроса — пары имя / значение разделяются амперсандом (&), а имена отделяются от значений символом равенства знак равно Примером этого может быть:
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
Тип контента «application / x-www-form-urlencoded» неэффективен для отправки больших количеств двоичных данных или текста, содержащих символы, отличные от ASCII. Тип контента «multipart / form-data» должен использоваться для отправки форм, содержащих файлы, данные, отличные от ASCII, и двоичные данные.
Понимание кодировки HTML-форм: URL-кодированные и составные формы
На днях я пытался написать конечную точку REST в Go, которая загружает содержимое формы, отправленной в браузере, в другую конечную точку REST, другими словами,
Форма в браузере ----> My GO Rest API ----> Другой REST API
При этом я изучил некоторые основы работы HTML-форм. Поэтому подумал, что было бы неплохо поделиться тем, что я узнал, и, следовательно, постом.. 🙂
Тип кодировки формы определяется атрибутом enctype
. Он может иметь три значения:
application/x-www-form-urlencoded
— представляет форму в кодировке URL. Это значение по умолчанию, если для атрибутаenctype
ничего не установлено.multipart/form-data
— представляет составную форму. Этот тип формы используется, когда пользователь хочет загрузить файлытекстовый/обычный
— новый тип формы, представленный в HTML5, который, как следует из названия, просто отправляет данные без какой-либо кодировки
Теперь давайте рассмотрим каждый тип формы на примере, чтобы лучше понять их.
Как следует из названия, данные, отправляемые с помощью формы этого типа, имеют кодировку URL. Заполните следующую форму: