Je veux poser une question sur le multipart/form-data
. Dans l'en-tête HTTP, je trouve que le Content-Type: multipart/form-data; boundary=???
.
Le ???
libre doit-il être défini par l'utilisateur? Ou est-il généré à partir du HTML? Est-il possible pour moi de définir le ??? = abcdefg
?
Réponses:
Oui.
Non. HTML n'a rien à voir avec ça. Lire ci-dessous.
Oui.
Si vous souhaitez envoyer les données suivantes au serveur Web:
utiliser
application/x-www-form-urlencoded
serait comme ceci:Comme vous pouvez le voir, le serveur sait que les paramètres sont séparés par une esperluette
&
. Si&
une valeur de paramètre est requise, elle doit être codée.Alors, comment le serveur sait-il où commence et se termine une valeur de paramètre lorsqu'il reçoit une demande HTTP en utilisant
multipart/form-data
?Utilisation de la frontière , similaire à
&
.Par exemple:
Dans ce cas, la valeur limite est
XXX
. Vous le spécifiez dans l'en-Content-Type
tête afin que le serveur sache comment diviser les données qu'il reçoit.Vous devez donc:
Utilisez une valeur qui n'apparaîtra pas dans les données HTTP envoyées au serveur.
Soyez cohérent et utilisez la même valeur partout dans le message de demande.
la source
La réponse exacte à la question est: oui, vous pouvez utiliser une valeur arbitraire pour le
boundary
paramètre , étant donné qu'il ne dépasse pas 70 octets de longueur et se compose uniquement de caractères 7 bitsUS-ASCII
(imprimables).Si vous utilisez l' un des
multipart/*
types de contenu, vous êtes effectivement tenu de spécifier leboundary
paramètre dans l' en-Content-Type
tête, sinon le serveur (dans le cas d'une requête HTTP) ne sera pas en mesure d'analyser la charge utile.Vous souhaiterez probablement également définir le
charset
paramètreUTF-8
dans votre en-Content-Type
tête, sauf si vous pouvez être absolument sûr que seul leUS-ASCII
jeu de caractères sera utilisé dans les données de charge utile.Quelques extraits pertinents de la RFC2046 :
4.1.2. Paramètre de jeu de caractères:
5.1. Type de support en plusieurs parties
Voici un exemple utilisant une frontière arbitraire:
la source
multipart / form-data contient une limite pour séparer les paires nom / valeur. La limite agit comme un marqueur de chaque bloc de paires nom / valeur transmis lorsqu'un formulaire est soumis. La limite est automatiquement ajoutée à un type de contenu d'un en-tête de demande.
Le formulaire avec l' attribut enctype = "multipart / form-data" aura un en-tête de demande Content-Type: multipart / form-data; limite --- WebKit193844043-h ( valeur générée par le navigateur ).
La charge utile passée ressemble à ceci:
Côté service Web, il est consommé sous forme @Consumes ("multipart / form-data").
Attention, lorsque vous testez votre service Web à l'aide de Chrome Postman, vous devez cocher l'option de données de formulaire (bouton radio) et le menu Fichier dans la liste déroulante pour envoyer la pièce jointe. La fourniture explicite de type de contenu en tant que données de partie / formulaire génère une erreur. Parce que la frontière est manquante car elle remplace la demande de curl de post man au serveur avec le type de contenu en ajoutant la frontière qui fonctionne bien.
Voir RFC1341 sec7.2 Le type de contenu en plusieurs parties
la source