Alors, qu’est-ce que le Multipart dans le protocole Http ? Ce qui suit est un extrait du protocole http 1.1 :
Dans le cas d'une entité multipart, où un ou plusieurs ensembles de données différents sont regroupés en un seul corps, un champ de type "multipart" doit apparaître dans l'en-tête de l'entité (champ d'en-tête). Le corps doit être constitué d'une ou plusieurs parties du corps, chacune précédant une ligne de démarcation et la dernière étant suivie d'une ligne de démarcation finale. Après sa ligne de démarcation, chaque partie du corps se compose de champs d'en-tête, de lignes vides et de corps.
La description ci-dessus est un peu déroutante à écrire, mais une compréhension simple peut être la suivante : une demande de publication peut définir plusieurs parties selon certaines spécifications ;
Ce qui suit utilise le protocole de maillage mobile (en fait, une requête comprend deux contenus XML indépendants, un XML de tête et un XML de corps) pour illustrer comment utiliser Jersey pour traiter Multipart. Le code principal est le suivant (le serveur le reçoit au début). Je ne savais pas comment écrire le code et je n'ai pas découvert comment les autres l'avaient écrit. Plus tard, quand je me suis mis en colère, j'ai décompilé le code du package jersey-multipart-1.0.3.1.jar et je l'ai regardé, et là j'ai compris) :
public static final String HeadFieldName = "xmlhead";
public static final String BodyFieldName = "xmlbody";
//Le client envoie du code
La publication de chaîne statique publique (tête de chaîne, corps de chaîne) lance BusinessException {
FormDataMultiPart multiPart = new FormDataMultiPart();
multiPart.field (RequestField.HeadFieldName, head, MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field (RequestField.BodyFieldName, corps, MediaType.MULTIPART_FORM_DATA_TYPE);
return webResource.type("multipart/form-data").post(String.class, multiPart);
}
// Le côté serveur reçoit le code
@POSTE
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consume({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
Le service public String (FormDataMultiPart multiPart) lève une exception {
si(multiPart == null){
si(_logger.isErrorEnabled()){
_logger.error("la requête FormDataMultiPart est nulle");
}
throw new Exception("la requête FormDataMultiPart est nulle");
}
List<RequestField> requestFields = new ArrayList<RequestField>();
pour (BodyPart bodyPart : multiPart.getBodyParts()){
String fieldName = ((FormDataBodyPart)bodyPart).getName().trim();
if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
sinon if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
autre{
si(_logger.isWarnEnabled()){
_logger.warn("nom de champ invalide :" + nom de champ + ",originXml :" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml version="1.0" encoding="UTF-8"?>
<InterBOSS>
<Version>0100</Version>
<TestFlag>0</TestFlag>
<TypeBIP>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<CodeAction>0</CodeAction>
</BIPType>
<Informations de routage>
<OrigDomain>IMPS</OrigDomain>
<TypeRoute>01</TypeRoute>
<Routage>
<Domaine personnel>BOSS</Domaine personnel>
<RouteValue>13810494631</RouteValue>
</Routage>
</InfoRoutage>
<TransInfo>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</TransInfo>
</InterBOSS>
--Boundary_1_30911772_1367997277472
Disposition du contenu : form-data;name="xmlbody"
Type de contenu : multipart/form-data
<?xml version="1.0" encoding="UTF-8"?>
<InterBOSS>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<abonnementServInfo>
<oprTime>20130508151436</oprTime>
<actionID>06</actionID>
<effTime>20130508151437</effTime>
<expireTime>30000101000000</expireTime>
<feeUser_ID>13810494631</feeUser_ID>
<destUser_ID>13810494631</destUser_ID>
<actionReasonID>1</actionReasonID>
<servType>210001</servType>
<subServType>FXCJHY</subServType>
<SPID>901508</SPID>
<SPServID>FXCJHY</SPServID>
<modeaccès>01</modeaccès>
<feeType>2</feeType>
</subscribeServInfo>
</subscribeServiceReq>]]></SvcCont>
</InterBOSS>
--Boundary_1_30911772_1367997277472--