Qu'est-ce qu'une requête multipartie http?

300

J'écris des applications iPhone depuis un certain temps maintenant, envoyant des données au serveur, recevant des données (via le protocole HTTP), sans trop y penser. Surtout, je suis théoriquement familier avec le processus, mais la partie que je ne connais pas si bien est la requête multipartie HTTP. Je connais sa structure de base, mais le noyau de celui-ci m'échappe.

Il semble que chaque fois que j'envoie quelque chose de différent du texte brut (comme des photos, de la musique), je dois utiliser une demande en plusieurs parties. Quelqu'un peut-il m'expliquer brièvement pourquoi il est utilisé et quels sont ses avantages?

Si je l'utilise, pourquoi est-il préférable d'envoyer des photos de cette façon?

MegaManX
la source
1
Voir le lien suivant pour plus d'informations: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
zargarf

Réponses:

286

Une demande HTTP en plusieurs parties est une demande HTTP que les clients HTTP construisent pour envoyer des fichiers et des données à un serveur HTTP. Il est couramment utilisé par les navigateurs et les clients HTTP pour télécharger des fichiers sur le serveur.

Iggy
la source
4
Je voulais juste ajouter que les champs de données du formulaire en plusieurs parties sont envoyés dans l'ordre . Ce n'est pas quelque chose qui est immédiatement évident - j'ai ajouté une liste de liens ici: github.com/balderdashy/skipper/blob/master/… Si j'ai le temps de monter un cas de test en utilisant PhantomJS / webkit, j'ajouterai le lien là aussi. Les navigateurs obéissent à cette partie de la spécification, même depuis IE6.
mikermcneil
89
La partie difficile est de comprendre pourquoi cela s'appelle une demande en plusieurs parties , au lieu de quelque chose de plus évident, comme une demande de téléchargement de fichier .
Rafael Eyng
28
Le PO voulait une approche et une réponse philosophiques. Cette réponse n'explique pas la partie «pourquoi». Il s'agit plus de "quoi". Je ne suis pas un grand fan de la baisse des votes, mais je soutiens que cette réponse n'est pas ce que voulait OP et j'ai cherché.
Saeed Neamati
6
Le type de contenu "application / x-www-form-urlencoded" est inefficace pour l'envoi de grandes quantités de données binaires ou de texte contenant des caractères non ASCII. Le type de contenu "multipart / form-data" doit être utilisé pour soumettre des formulaires contenant des fichiers, des données non ASCII et des données binaires. SOURCE ORIGINALE - w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Aditya Aggarwal
2
Plus de détails avec des captures d'écran de Firebug ici: cubicrace.com/2016/05/upload-files-https-using-java.html
Piyush Chordia
22

Comme l'indique la spécification officielle ( https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html ), " un ou plusieurs ensembles de données différents sont combinés dans un seul corps ". Ainsi, lorsque les photos et la musique sont traitées comme des messages en plusieurs parties, comme mentionné dans la question, il y a probablement aussi des métadonnées en texte brut associées, ce qui rend la demande contenant différents types de données (binaires, texte), ce qui implique l'utilisation de plusieurs parties.

csonti
la source
2
Je ne pense pas que ce soit le cas. Lors du téléchargement d'une image, l'image entière (y compris les métadonnées) sera un ensemble de données dans le corps de la demande. C'est toujours une demande en plusieurs parties, même s'il n'y a qu'une seule partie dans le corps. Vous pouvez également créer une demande pour télécharger plusieurs fichiers à la fois.
Dario Seidl
1
@DarioSeidl la norme suppose que vous pouvez soumettre un téléchargement de fichier à partir d'un formulaire Web, qui peut inclure d'autres champs de données en plus du téléchargement de fichier lui-même. Par exemple, en plus du nom de fichier d'origine, l'utilisateur peut inclure une description. Multipart gère également les blobs binaires génériques qui sont déconnectés du concept d'un "fichier" d'origine particulier.
Ionoclast Brigham