Quiero hacer una pregunta sobre el multipart/form-data
. En el encabezado HTTP, encuentro que el Content-Type: multipart/form-data; boundary=???
.
¿El ???
usuario puede definir la libertad? ¿O se genera a partir del HTML? ¿Es posible para mí definir el ??? = abcdefg
?
Respuestas:
Si.
No. HTML no tiene nada que ver con eso. Lee abajo.
Si.
Si desea enviar los siguientes datos al servidor web:
usar
application/x-www-form-urlencoded
sería así:Como puede ver, el servidor sabe que los parámetros están separados por un ampersand
&
. Si&
se requiere para un valor de parámetro, debe estar codificado.Entonces, ¿cómo sabe el servidor dónde comienza y termina un valor de parámetro cuando recibe una solicitud HTTP
multipart/form-data
?Usando el límite , similar a
&
.Por ejemplo:
En ese caso, el valor límite es
XXX
. Lo especifica en elContent-Type
encabezado para que el servidor sepa cómo dividir los datos que recibe.Entonces necesitas:
Use un valor que no aparecerá en los datos HTTP enviados al servidor.
Sea coherente y use el mismo valor en todas partes en el mensaje de solicitud.
fuente
La respuesta exacta a la pregunta es: sí, puede usar un valor arbitrario para el
boundary
parámetro , dado que no supera los 70 bytes de longitud y consta solo de caracteres de 7 bitsUS-ASCII
(imprimibles).Si está utilizando uno de los
multipart/*
tipos de contenido, en realidad debe especificar elboundary
parámetro en elContent-Type
encabezado; de lo contrario, el servidor (en el caso de una solicitud HTTP) no podrá analizar la carga útil.Probablemente también desee establecer el
charset
parámetroUTF-8
en suContent-Type
encabezado, a menos que pueda estar absolutamente seguro de que solo seUS-ASCII
usará charset en los datos de carga útil.Algunos extractos relevantes del RFC2046 :
4.1.2. Parámetro Charset:
5.1. Tipo de medio multiparte
Aquí hay un ejemplo usando un límite arbitrario:
fuente
multipart / form-data contiene límites para separar pares de nombre / valor. El límite actúa como un marcador de cada porción de pares de nombre / valor pasados cuando se envía un formulario. El límite se agrega automáticamente a un tipo de contenido de un encabezado de solicitud.
El formulario con el atributo enctype = "multipart / form-data" tendrá un encabezado de solicitud Content-Type: multipart / form-data; límite --- WebKit193844043-h (valor generado por el navegador ).
La carga útil pasada se parece a esto:
En el lado del servicio web, se consume en forma @Consumes ("multipart / form-data").
Tenga cuidado, cuando pruebe su servicio web utilizando el cartero de Chrome, debe verificar la opción de datos del formulario (botón de opción) y el menú Archivo en el cuadro desplegable para enviar el archivo adjunto. La provisión explícita de tipo de contenido como datos multiparte / formulario arroja un error. Debido a que falta el límite, ya que anula la solicitud de curl de post man al servidor con tipo de contenido agregando el límite que funciona bien.
Ver RFC1341 sec7.2 El tipo de contenido multiparte
fuente