Www form urlencoded form: http — application/x-www-form-urlencoded or multipart/form-data?

Отправка форм | Протокол HTTP

Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

В этом уроке мы рассмотрим особенности отправки форм в HTTP. Формы — это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта. К ним относятся текстовые поля для ввода данных с клавиатуры, списки для выбора предопределенных данных, флажки для установки параметров. Работать будем с локально поднятым сервером, так как со сторонними серверами при тестировании на них наших уроков возникают сложности. В принципе, вы можете поэкспериментировать на любом доступном сервере. Только убедитесь, что он работает по HTTP, а не по HTTPS, так как там взаимодействие происходит немного по-другому и одного telnet будет недостаточно.

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

Обычно используется следующий формат Content-Type: application/x-www-form-urlencoded. Это простой формат — ключ равно значение и амперсанд между ними.

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. Заполните следующую форму:

 
Войти в полноэкранный режимВыйти из полноэкранного режима

Здесь видно, что форма отправляется на сервер с помощью POST-запроса, это означает, что она имеет тело. а как форматируется тело? Он закодирован в URL. По сути, создается длинная строка из (имя, значение) пар. Каждая пара (имя, значение) отделяется друг от друга знаком & (амперсанд) , и для каждой пары (имя, значение)

имя отделяется от значения знаком = (равно) , например,

key1=value1&key2=value2

некоторые параметры запроса, переданные в URL-адресе действия, /urlencoded?firstname=sid&lastname=sloth .

Разве тело, закодированное в URL-адресе, и параметры запроса, переданные в URL-адресе действия, не выглядят ужасно похожими? Это потому, что они похожи. Они имеют один и тот же формат, описанный выше.

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

Здесь следует отметить заголовок Content-Type , в котором говорится application/x-www-form-urlencoded , строка запроса и поля формы передаются на сервер в формате, как обсуждалось выше.

Примечание: Пусть вас не смущает термин «данные формы» на снимке экрана. Именно так Google Chrome представляет поля формы.

Все хорошо, но есть еще кое-что в процессе кодирования. Давайте введем некоторые пробелы в представленных значениях, примем приведенную ниже форму, которая такая же, как и предыдущая, но значение имя изменено с sid на sid slayer и значение имени пользователя изменено с sidthesloth на Сид ленивец .

 
    
    
    

 
Войти в полноэкранный режимВыйти из полноэкранного режима

Теперь попробуйте отправить форму и посмотреть, как поля формы переносятся в инструменты разработчика. Вот оснастка инструментов разработчика в Chrome.

Как видно, пробелы заменены либо на «%20», либо на «+». Это делается как для параметров запроса, так и для тела формы.

Прочтите это, чтобы понять, когда можно использовать + и %20. Это включает в себя процесс кодирования URL.

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

Чтобы преобразовать приведенную выше форму в составную форму, все, что вам нужно сделать, это изменить атрибут enctype тега формы с application/x-www-form-urlencoded на multipart/form-data .

 
    
    
    

 
Войти в полноэкранный режимВыйти из полноэкранного режима

Давайте отправим его и посмотрим, как он появится в инструментах разработчика.

Здесь следует отметить две вещи: заголовок Content-Type и полезную нагрузку запроса формы. Давайте пройдемся по ним один за другим.

Заголовок Content-Type

Значение заголовка Content-Type , очевидно, равно multipart/form-data . Но у него есть и другое значение, граница . Значение для this в приведенном выше примере генерируется браузером, но пользователь также может определить его, скажем, например, border=sidtheslothboundary . В следующем разделе мы увидим, насколько это полезно.

Тело запроса

Полезная нагрузка запроса содержит сами поля формы. Каждая пара (имя, значение) преобразуется в часть сообщения MIME следующего формата:

--<>
Content-Disposition: данные формы; name="<>"

<>

Приведенный выше формат повторяется для каждой пары (имя, значение) .

Наконец, вся полезная нагрузка завершается значением границы с суффиксом -- . Таким образом, весь запрос выглядит следующим образом:

--<>
Content-Disposition: form-data; имя="<<имя_поля>>"

<>
--<>
Content-Disposition: form-data; name="<>"

<>
--<>--

Теперь мы видим, как используется граничное значение.

В случае формы application/x-www-form-urlencoded амперсанд и действует как разделитель между каждыми 9Пара 0005 (имя, значение) , позволяющая серверу понять, когда и где начинается и заканчивается значение параметра.

username=sidthelsloth&password=slothsecret

В случае формы multipart/form-data для этой цели служит граничное значение. Скажем, если бы граничное значение было XXX , полезная нагрузка запроса выглядела бы так:

--XXX
Content-Disposition: form-data; имя = "имя пользователя"

sidthesloth
--XXX
Content-Disposition: form-data; name="password"

slothsecret
--XXX--

Дефисы сами по себе не являются частью граничного значения, а необходимы как часть формата запроса. Заголовок Content-Type для приведенного выше запроса будет следующим:

Content-Type: multipart/form-data; border=XXX

Это позволяет браузеру понять, когда и где начинается и заканчивается каждое поле.

Эти формы в значительной степени аналогичны формам с кодировкой URL, за исключением того, что поля формы не кодируются URL при отправке на сервер. Обычно они не используются широко, но были представлены как часть спецификации HTML 5.

Избегайте их использования, так как они предназначены для человеческого понимания, а не для машин.

Как указано в спецификации,

Полезные нагрузки, использующие формат text/plain, предназначены для чтения человеком. Они не могут быть надежно интерпретированы компьютером из-за неоднозначного формата (например, невозможно отличить литеральную новую строку в значении от новой строки в позиции 9).0039 конец значения).

Надеюсь, я ясно объяснил, что я узнал.. Увидимся в следующем, ребята.. Мир.. 🙂

Узнайте больше обо мне на моем сайте..✨

Разница между application/x- www-form-urlencoded и multipart/form-data в HTTP/HTML?

Недавно в одном из интервью с веб-разработчиком Java один из моих читателей спросил о разнице между типами x-www-form-url-encoded и multipart/form-data MIME. В HTTP существует два способа отправки данных HTML-формы на сервер: либо с помощью ContentType application/x-www-form-urlencoded, либо с помощью multipart/form-data. Несмотря на то, что оба они могут использоваться для отправки на сервер как текстовых, так и двоичных данных, между ними есть тонкая разница. В случае x-www-form-urlencoded все данные формы отправляются в виде длинной строки запроса.

Строка запроса содержит пары «имя-значение», разделенные символом &, например. field1=value1&field2=value2 и т. д.

Это похоже на кодировку URL и обычный запрос GET, где данные отправляются по URL-адресу, но данные формы попадают в тело запроса POST и кодируются таким образом.

Кроме того, как зарезервированные, так и не буквенно-цифровые символы заменяются на %HH, знаком процента и двумя шестнадцатеричными цифрами, представляющими код ASCII символа, например. пробел заменяется символом %20 в URL-адресе.

С другой стороны, когда вы выбираете HTTP-заголовок ContentType=multipart/form-data, данные отправляются порциями на сервер, где граница создается символом, который не должен появляться в содержимом.

Это достигается за счет использования подходящей кодировки, например. выбор кодировки base64, а затем создание символа за пределами схемы кодирования base64 в качестве границы. Данные multipart/form часто используются при загрузке файлов на сервер.

Кстати, я согласен с тем, что веб-разработка — это очень обширная тема, и вам нужно многому научиться, помимо фреймворков и языков программирования. Вот почему я предлагаю каждому веб-разработчику пройти курс Web Developer BootCamp от Colt Steele. Это один из лучших ресурсов, который поможет заполнить пробелы в вашем понимании и стать ценным веб-разработчиком.

x-www-form-urlencoded против multipart/form-data

Давайте рассмотрим еще несколько важных моментов о типах контента x-www-form-urlencoded и multipart/form-data в HTTP:

1) Оба типа являются MIME, которые отправляются в HTTP-заголовке ContentType, например.
ContentType: application/x-www-form-urlencoded
ContentType: application/multipart/form-data

2) Оба способа отправки данных пар имя-значение на сервер, т. е. данные, которые вы ввели в HTML-форму, отправлено с помощью этих двух на сервер.

3) Оба типа содержимого используются при отправке данных формы в виде POST-запроса.

4) x-www-form-urlencoded в более общем смысле используется для отправки текстовых данных на сервер, тогда как multipart/form-data используется для отправки двоичных данных, в первую очередь для загрузки файлов на сервер.

5) Для пользовательских агентов, таких как браузер, требуется поддержка обоих типов MIME.

6) В случае x-www-form-urlencoded все пары имя-значение отправляются как одна большая строка запроса, где буквенно-цифровой и зарезервированный символ кодируются в URL-адресе, т.е. заменяются % и их шестнадцатеричным значением, например. пробел заменен на %20. Длина этой строки не определяется спецификацией HTTP и зависит от реализации сервера.

7) В случае multipart/form-data каждая часть отделена определенной границей строки (выбранной специально, чтобы эта граничная строка не встречалась ни в одной из полезных данных «value».

8) multipart /form-data более эффективен, чем x-www-form-urlencoded , потому что вам не нужно заменять один символ тремя байтами, как того требует кодировка URL.


Следует ли всегда использовать multipart/form-data?

Учитывая, что multipart/form-data более эффективен, чем x-www-form-urlencoded, у некоторых из вас может возникнуть вопрос: почему бы не использовать multipart/form-data все время? Ну, это не идея.

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

Следовательно, рекомендуется использовать x-www-form-urlencoded, когда вам нужно отправить данные формы, например. большая часть веб-формы, которая просит вас ввести значения и использовать multipart/form-data, когда вам нужно загрузить файлы на сервер, как здесь.

Вот и вся разница между x-www-form-urlencoded и multipart/form-data заголовки типа контента в HTTP. Несмотря на то, что оба используются для отправки данных формы или списка пар ключ-значение на сервер, x-www-form-urlencoded более эффективен и должен использоваться для всех общих целей, в то время как multipart/form-data должен использоваться исключительно используется для загрузки файлов на сервер.

Дополнительное обучение
Учебный курс для веб-разработчиков
Java Web Fundamentals By Kevin Jones
Spring Framework 5: от новичка до гуру

Другое Java и статьи по веб-разработке вам может понравиться
Дорожная карта разработчиков React на 2019 год (дорожная карта)
10 фреймворков Java и веб-разработчики, которые следует изучить (фреймворки)
10 вещей, которые Java-программист должен изучить в 2019 году (цели)
10 курсов по изучению DevOps для опытных программистов (курсы)
10 высокооплачиваемых технологий, которым должен научиться программист в 2019 году (технологии)
10 фреймворков FullStack Developer (фреймворки)
10 инструментов Java-разработчик должен изучить в 2019 году (инструменты)

Благодарим вас за то, что дочитали эту статью.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *