предисловие
Сегодня в полдень, после получения ланч-бокса, когда я ел, чтобы успеть за расписанием, мне пришлось набирать код во время еды.Чтобы отправить картинку на бэкенд, я использовалnew FormData()
положить фотографииappend
войти, симулироватьform
Form submit, паника, торопился, думаю, что можно весело покушать, бэкенд сказал, что данных нет... Данные я явно передаю на бэкенд, почему у холостяков конфидент? Давайте войдем в нашу тему на этот раз
Введение
чтоForm Data
? чтоRequestPayload
?FormData
а такжеPayload
дабраузерпередатьинтерфейсдва формата, два путибраузерчерезContent-Type
значение, чтобы различать:
- если
application/x-www-form-urlencoded
, тогдаForm Data
Способ - если
application/json
илиmultipart/form-data
, тогдаRequestPayload
Путь.
существуетPOST
представление
Content-Type |
формат запроса |
---|---|
application/x-www-form-urlencoded |
formdata |
application/json |
request payload |
multipart/form-data |
request payload |
отТипы MIME для MDNЭту статью можно увидеть:multipart/form-data
можно использовать наHTML
Формы отправляют информацию из браузера на сервер. так каксоставнойФормат документа, который состоит из разных частей, разделенных граничными линиями (строка, начинающаяся с «--»). Каждая часть имеет свою собственную сущность и свою собственнуюHTTP
заголовок запроса,Content-Disposition
а такжеContent-Type
Используется в поле загрузки файла, чаще всего используется (Content-Length
потому что граница игнорируется как разделитель). Как показано ниже:
Form Data
Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(data)
--aBoundaryString
(more subparts)
--aBoundaryString--
Request Paload
В чем разница между полезной нагрузкой запроса и formData в HTTP-запросе?
объясняется следующим образом: FormData
а такжеPayload
дабраузерпередатьинтерфейсдва формата, два путибраузерчерезContent-Type
значение для различения, если оноapplication/x-www-form-urlencoded
, тогдаForm Data
Путь, если этоapplication/json
илиmultipart/form-data
, тогдаRequestPayload
Путь.
Ссылка на ссылку:stackoverflow.com/questions/2…Объяснение следующее:
Запрос может выглядеть так, если он сопровождается:
POST /some-path HTTP/1.1
Content-Type: application/json
{ "foo" : "bar", "name" : "John" }
если ты простойajax
просить. просилheader
будет установлен наContent-Type: application/json
. Браузер просто расценит вашу отправку какpayload
Покажите ему, это все, что он может сделать, потому что он не знает, откуда берутся данные.
Если вы отправляетеhtml
сформировать и настроитьmethod="post"
, и установитеContent-Type: application/x-www-form-urlencoded
илиContent-Type: multipart/form-data
. Тогда ваш запрос может выглядеть так:
POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencoded
foo=bar&name=John
здесьform-data
то естьrequest payload
. Здесь браузер знает больше: он знаетbar
поле ввода для отправки формыfoo
ценность . Это то, что он показывает вам.
Так что разница в том, что они просто потому, чтоContent-Type
Разница в настройках не является разницей в способе отправки данных, обе отправки будут помещать данные вmessage-body
середина. ноchrome
Инструменты разработчика браузера будут основаны на этомContentType
Различайте способы отображения.
payload
середина.Так в чем же разница? Почему иногда бэкэнд не может получить значение?? Это должно быть правдойpayload
способ анализа. Мы берем несколькоchrome
Следующий тестовый пример объяснит эту логику.
традиционныйForm表单
Сцена подчинения строится следующим образом:
<form action="/" method="POST">
<input name="name" type="text">
<input name="password" type="text">
<button>提交</button>
</form>
Если я нажму кнопку «Отправить», принесет браузер для отправки функции, результат похож на?
будь осторожен
можно увидетьContent-Type
дляapplication/x-www-form-urlencoded
.
Значение находится в видеkey1=value1&key2=value2
представлены в форме.
традиционныйajax
представить
строительство сцены
function submit2() {
var xhr = new XMLHttpRequest();
xhr.timeout = 3000;
var obj = {a: 1, b: 2};
xhr.open('POST', '/');
xhr.send(obj);
}
Сначала мы создаем простую функцию, а затем запускаем ее. пройти черезchrome
Из отзыва:
Традицияajax
Отправьте следующие пункты
- По умолчанию
的Content-Type
дляtext/plain
. -
Request Payload
Мы будем выполнять нестроковое преобразование строк. - пройти через
xhr.send(JSON.stringify(obj))
;Может изменить содержимое для отправки
будь осторожен
- Когда мы передаем строки,
Content-Type
Автоматически конвертировать вxxx-form-xxx
форма. Когда это объект, он автоматически преобразуется вxxx/json
. - Строка с
key1=val1&key2=val2
воплощается в виде предмета в видеJSON
Выражается в виде строки.
Суммировать
Content-Type
разница
- традиционный
ajax
при запросе,Content-Typ
е по умолчанию文本
Типы. - традиционный
form
При подаче,Content-Type
По умолчаниюForm
Типы. -
axios
При передаче строкиContent-Type
По умолчаниюForm
Типы. -
axios
При передаче объектаContent-Type
По умолчаниюJSON
Типы.
Content-Type
значение ,Form
а также非Form
час,payload
Разница:
- Оба поддерживают только строковые типы (несколько случаев рассмотрены выше).
-
Form
Передаваемый форматkey1=value1&key2=value2
,аналогичныйGET
просилQueryString
Формат - Нет
Form
в общемJSON.stringify(formDataObject)
форма
Поэтому, если серверная часть не может получить значение, независимо от того, какая форма передается, когда серверная часть анализирует информацию формы, она будет учитыватьContent-Type
. еслиJSON
Строка, внутренний синтаксический анализpayload
Когда содержаниеJSON
. еслиkey1=value1&key2=value2
форма, вам нужно разделить строку. Эти вещи обычно обрабатываются фреймворком, используемым бэкендом, но интерфейс значений, предоставляемый фреймворком для бэкенда, может отличаться, поэтому партнеры переднего плана должны обсуждать с партнерами бэкенда при работе с запросом. проблемы.JSON
ещеFormData
.
Использованная литература:
- MIME-тип
- Content-Type
- How to set a boundary on a multipart/form-data request while using jquery ajax FormData() with multiple files
Распространенными типами медиаформатов являются следующие:
-
text/html
: формат HTML -
text/plain
: обычный текстовый формат -
text/xml
: формат XML -
image/gif
: формат изображения GIF -
image/jpeg
: формат изображения jpg -
image/png
: формат изображения png
кapplication
Типы медиаформатов, начинающиеся с:
-
application/xhtml+xml
: формат XHTML -
application/xml
: формат данных XML -
application/atom+xml
: Формат агрегации Atom XML -
application/json
: формат данных JSON -
application/pdf
: формат пдф -
application/msword
: Формат документа Word -
application/octet-stream
: данные двоичного потока (например, загрузка обычных файлов) -
application/x-www-form-urlencoded
:<form encType=””>
по умолчаниюencType
,form
Данные формы кодируются какkey/value
Формат отправляется на сервер (формат формы по умолчанию для отправки данных)
Другой распространенный формат мультимедиа используется при загрузке файлов:
-
multipart/form-data
: Вам нужно использовать этот формат, когда вам нужно загрузить файлы в форме