Entonces, ¿qué es Multipart en el protocolo Http? El siguiente es un extracto del protocolo http 1.1:
En el caso de una entidad multiparte, donde uno o más conjuntos de datos diferentes se combinan en un solo cuerpo, debe aparecer un campo de tipo "multiparte" en el encabezado de la entidad (campo de encabezado). El cuerpo debe constar de una o más partes del cuerpo, cada una de las cuales precede a una línea delimitadora de límites y la última va seguida de una línea delimitadora de límites final. Después de su línea delimitadora de límites, cada parte del cuerpo consta de campos de encabezado, líneas en blanco y cuerpo.
La descripción anterior es un poco confusa de escribir, pero una comprensión simple puede ser la siguiente: una solicitud de publicación puede definir varias partes de acuerdo con ciertas especificaciones;
A continuación se utiliza el protocolo de malla móvil (en realidad, una solicitud incluye dos contenidos xml independientes, un xml de encabezado y un xml de cuerpo) para ilustrar cómo usar Jersey para procesar Multipart. El código principal es el siguiente (el servidor lo recibe al principio). No sabía cómo escribir el código y no descubrí cómo lo escribieron otros. Más tarde, cuando me enojé, descompilé el código del paquete jersey-multipart-1.0.3.1.jar y lo miré. y luego entendí):
cadena final estática pública HeadFieldName = "xmlhead";
cadena final estática pública BodyFieldName = "xmlbody";
//El cliente envía el código
publicación de cadena estática pública (cabeza de cadena, cuerpo de cadena) lanza BusinessException {
FormDataMultiPart multiPart = nuevo FormDataMultiPart();
multiPart.field(RequestField.HeadFieldName, encabezado, MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field(RequestField.BodyFieldName, cuerpo, MediaType.MULTIPART_FORM_DATA_TYPE);
return webResource.type("multipart/form-data").post(String.class, multiPart);
}
// El lado del servidor recibe el código
@CORREO
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
El servicio de cadena pública (FormDataMultiPart multiPart) arroja una excepción {
si(multiPart == nulo){
si(_logger.isErrorEnabled()){
_logger.error("la solicitud FormDataMultiPart es nula");
}
lanzar una nueva excepción ("la solicitud FormDataMultiPart es nula");
}
Lista<RequestField> requestFields = new ArrayList<RequestField>();
for(PartedelcuerpoPartedelcuerpo: multiPart.getPartesdelcuerpo()){
Cadena nombre del campo = ((FormDataBodyPart)bodyPart).getName().trim();
if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
else if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
demás{
si(_logger.isWarnEnabled()){
_logger.warn("Nombre de campo no válido:" + Nombre de campo + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml versión="1.0" codificación="UTF-8"?>
<InterJEFE>
<Versión>0100</Versión>
<TestFlag>0</TestFlag>
<Tipo BIP>
<BIPCode>BIP2B543</BIPCode>
<Código de actividad>T2001543</Código de actividad>
<CódigoAcción>0</CódigoAcción>
</BIPTipo>
<Información de ruta>
<DominioOrig>IMPS</DominioOrig>
<Tipo de ruta>01</Tipo de ruta>
<Ruta>
<DominioInicio>JEFE</DominioInicio>
<ValorDeRuta>13810494631</ValorDeRuta>
</Enrutamiento>
</EnrutamientoInfo>
<TransInfo>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TiempoTransIDO>20130508151437</TiempoTransIDO>
</TransInfo>
</InterBOSS>
--Límite_1_30911772_1367997277472
Disposición de contenido: form-data;name="xmlbody"
Tipo de contenido: multiparte/datos de formulario
<?xml versión="1.0" codificación="UTF-8"?>
<InterJEFE>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<suscribirServInfo>
<oprHora>20130508151436</oprHora>
<ID de acción>06</ID de acción>
<effHora>20130508151437</effHora>
<horadeexpire>30000101000000</horadeexpire>
<feeUser_ID>13810494631</feeUser_ID>
<destUser_ID>13810494631</destUser_ID>
<actionReasonID>1</actionReasonID>
<tipoServ>210001</tipoServ>
<subServType>FXCJHY</subServType>
<SPID>901508</SPID>
<SPServID>FXCJHY</SPServID>
<modoacceso>01</modoacceso>
<feeType>2</feeType>
</subscribeServInfo>
</subscribeServiceReq>]]></SvcCont>
</InterBOSS>
--Límite_1_30911772_1367997277472--