¿Qué es la solicitud HTTP multiparte?

300

He estado escribiendo aplicaciones para iPhone desde hace algún tiempo, enviando datos al servidor, recibiendo datos (a través del protocolo HTTP), sin pensar demasiado en ello. Principalmente estoy teóricamente familiarizado con el proceso, pero la parte que no estoy tan familiarizada es la solicitud de múltiples partes HTTP. Sé su estructura básica, pero el núcleo de ella se me escapa.

Parece que cada vez que envío algo diferente al texto sin formato (como fotos, música), tengo que usar una solicitud de varias partes. ¿Alguien puede explicarme brevemente por qué se usa y cuáles son sus ventajas?

Si lo uso, ¿por qué es una mejor manera de enviar fotos de esa manera?

MegaManX
fuente
1
Consulte el siguiente enlace para obtener información: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
zargarf

Respuestas:

286

Una solicitud multiparte HTTP es una solicitud HTTP que los clientes HTTP construyen para enviar archivos y datos a un servidor HTTP. Es comúnmente utilizado por los navegadores y los clientes HTTP para cargar archivos al servidor.

Iggy
fuente
44
Solo quería agregar que los campos de datos de formulario multiparte se envían en orden . Esto no es algo que sea obvio de inmediato: agregué una lista de enlaces aquí: github.com/balderdashy/skipper/blob/master/... Si tengo tiempo para armar un caso de prueba usando PhantomJS / webkit, agregaré el enlace allí también. Los navegadores obedecen esta parte de la especificación, incluso desde IE6.
mikermcneil
88
La parte difícil es entender por qué se llama solicitud multiparte , en lugar de algo más obvio, como la solicitud de carga de archivos .
Rafael Eyng
28
El OP quería un enfoque filosófico y una respuesta. Esta respuesta no explica la parte "por qué". Se trata más de "qué" parte. No soy un gran admirador del voto negativo, pero sostengo que esta respuesta no es lo que OP quería y busqué.
Saeed Neamati
66
El tipo de contenido "application / x-www-form-urlencoded" es ineficiente para enviar grandes cantidades de datos binarios o texto que contenga caracteres no ASCII. El tipo de contenido "multipart / form-data" debe usarse para enviar formularios que contienen archivos, datos no ASCII y datos binarios. FUENTE ORIGINAL - w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Aditya Aggarwal
2
Más detalles con capturas de pantalla de Firebug aquí: cubicrace.com/2016/05/upload-files-https-using-java.html
Piyush Chordia
22

Como dice la especificación oficial ( https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html ), " uno o más conjuntos diferentes de datos se combinan en un solo cuerpo ". Entonces, cuando las fotos y la música se manejan como mensajes multiparte como se menciona en la pregunta, probablemente también hay algunos metadatos de texto sin formato asociados, lo que hace que la solicitud contenga diferentes tipos de datos (binario, texto), lo que implica el uso de multiparte.

csonti
fuente
2
No creo que ese sea el caso. Al cargar una imagen, toda la imagen (incluidos los metadatos) será un conjunto de datos en el cuerpo de la solicitud. Sigue siendo una solicitud de varias partes, incluso si solo hay una parte en el cuerpo. También puede crear una solicitud para cargar varios archivos a la vez.
Dario Seidl
1
@DarioSeidl, el estándar supone que puede enviar una carga de archivo desde un formulario web, que puede incluir otros campos de datos además de la carga del archivo en sí. Por ejemplo, además del nombre del archivo original, el usuario puede incluir una descripción. Multipart también maneja blobs binarios genéricos que están desconectados del concepto de un "archivo" de origen particular.
Ionoclast Brigham