Что такое http multipart запрос?

300

Я уже некоторое время пишу приложения для iPhone, отправляю данные на сервер, получаю данные (по протоколу HTTP), не слишком задумываясь об этом. В основном я теоретически знаком с процессом, но часть, с которой я не очень знаком, - это многокомпонентный запрос HTTP. Я знаю его базовую структуру, но суть ее ускользает от меня.

Кажется, что всякий раз, когда я отправляю что-то отличное от простого текста (например, фотографии, музыку), я должен использовать многочастный запрос. Может кто-нибудь кратко объяснить мне, почему он используется и каковы его преимущества?

Если я использую это, почему это лучший способ отправить фотографии таким образом?

MegaManX
источник
1
Для получения дополнительной информации см. Следующую ссылку: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
zargarf

Ответы:

286

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

Iggy
источник
4
Просто хотел добавить, что составные поля данных формы отправляются по порядку . Это не то, что сразу очевидно: я добавил список ссылок здесь: github.com/balderdashy/skipper/blob/master/… Если у меня будет время собрать тестовый пример с помощью PhantomJS / webkit, я добавлю ссылка там тоже есть. Браузеры подчиняются этой части спецификации, даже начиная с IE6.
mikermcneil
89
Самое сложное - понять, почему это называется многочастным запросом , а не чем-то более очевидным, например, запросом на загрузку файла .
Рафаэль Эйнг
28
ОП хотела философский подход и ответ. Этот ответ не объясняет, почему. Это больше о том, «что». Я не большой поклонник голосования, но я утверждаю, что этот ответ не тот, который хотел ОП, и я искал.
Саид Нимати
6
Тип содержимого «application / x-www-form-urlencoded» неэффективен для отправки большого количества двоичных данных или текста, содержащего символы не ASCII. Тип контента "multipart / form-data" должен использоваться для отправки форм, которые содержат файлы, данные не ASCII и двоичные данные. ОРИГИНАЛЬНЫЙ ИСТОЧНИК - w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Адитья Аггарвал
2
Подробнее о скриншотах с firebug можно прочитать здесь: cubicrace.com/2016/05/upload-files-https-using-java.html
Piyush Chordia
22

Как говорится в официальной спецификации ( https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html ), « один или несколько разных наборов данных объединены в одно тело ». Таким образом, когда фотографии и музыка обрабатываются как составные сообщения, как упоминалось в вопросе, вероятно, также существуют некоторые метаданные в виде простого текста, что делает запрос, содержащий различные типы данных (двоичные, текстовые), что подразумевает использование составных частей.

csonti
источник
2
Я не думаю, что это так. При загрузке изображения все изображение (включая метаданные) будет одним набором данных в теле запроса. Это все еще составной запрос, даже если в теле есть только одна часть. Вы также можете создать запрос на загрузку нескольких файлов одновременно.
Дарио Сейдл
1
@DarioSeidl стандарт предполагает, что вы можете отправлять файл из веб-формы, который может включать в себя другие поля данных в дополнение к самой загрузке файла. Например, в дополнение к исходному имени файла пользователь может включить описание. Multipart также обрабатывает общие двоичные двоичные объекты, которые не связаны с концепцией конкретного исходного файла.
Ионокласт Бригам