Я хочу задать вопрос о multipart/form-data
. В заголовке HTTP я обнаружил, что Content-Type: multipart/form-data; boundary=???
.
Является ли ???
свободный быть определенным пользователем? Или это сгенерировано из HTML? Можно ли мне определить ??? = abcdefg
?
Ответы:
Да.
Нет. HTML не имеет к этому никакого отношения . Читай ниже.
Да.
Если вы хотите отправить следующие данные на веб-сервер:
использование
application/x-www-form-urlencoded
будет выглядеть так:Как видите, сервер знает, что параметры разделены амперсандом
&
. Если&
для значения параметра требуется, то оно должно быть закодировано.Так как же сервер узнает, где начинается и заканчивается значение параметра, когда он получает HTTP-запрос, используя
multipart/form-data
?Используя границу , похожую на
&
.Например:
В этом случае граничное значение равно
XXX
. Вы указываете это вContent-Type
заголовке, чтобы сервер знал, как разделить полученные данные.Так что вам нужно:
Используйте значение, которое не будет отображаться в данных HTTP, отправляемых на сервер.
Будьте последовательны и используйте одно и то же значение везде в сообщении запроса.
источник
Точный ответ на вопрос: да, вы можете использовать произвольное значение для
boundary
параметра , если оно не превышает 70 байт и состоит только из 7-битныхUS-ASCII
(печатаемых) символов.Если вы используете один из
multipart/*
типов контента, вам действительно необходимо указатьboundary
параметр вContent-Type
заголовке, иначе сервер (в случае HTTP-запроса) не сможет проанализировать полезную нагрузку.Вы, вероятно, также хотите установить
charset
параметрUTF-8
в своемContent-Type
заголовке, если только вы не можете быть абсолютно уверены, чтоUS-ASCII
в данных полезной нагрузки будет использоваться только кодировка.Несколько соответствующих выдержек из RFC2046 :
4.1.2. Параметр Charset:
5.1. Multipart Media Type
Вот пример использования произвольной границы:
источник
multipart / form-data содержит границу для разделения пар имя / значение. Граница действует как маркер каждого куска пар имя / значение, переданных при отправке формы. Граница автоматически добавляется к типу содержимого заголовка запроса.
Форма с атрибутом enctype = "multipart / form-data" будет иметь заголовок запроса Content-Type: multipart / form-data; border --- WebKit193844043-h ( сгенерированный браузером vaue ).
Переданная полезная нагрузка выглядит примерно так:
Со стороны веб-сервиса, он используется в форме @Consumes ("multipart / form-data").
Помните, что при тестировании вашего веб-сервиса с помощью Chrome Postman вам необходимо проверить опцию данных формы (переключатель) и меню «Файл» из выпадающего списка, чтобы отправить вложение. Явное предоставление типа содержимого как multipart / form-data приводит к ошибке. Потому что граница отсутствует, поскольку она переопределяет запрос curl почтового человека на сервер с типом контента, добавляя границу, которая работает нормально.
См. RFC1341 sec7.2 Multipart Content-Type.
источник