Was ist also Multipart im HTTP-Protokoll? Das Folgende ist ein Auszug aus dem http-Protokoll 1.1:
Im Falle einer mehrteiligen Entität, bei der ein oder mehrere unterschiedliche Datensätze zu einem einzigen Körper zusammengefasst werden, muss im Header (Header-Feld) der Entität ein Feld vom Typ „multipart“ erscheinen. Der Körper muss aus einem oder mehreren Körperteilen bestehen, denen jeweils eine Grenzbegrenzungslinie vorangeht und dem letzten eine abschließende Grenzbegrenzungslinie folgt. Nach der Begrenzungslinie besteht jeder Textteil aus Kopffeldern, Leerzeilen und Text.
Die obige Beschreibung ist etwas verwirrend zu schreiben, aber ein einfaches Verständnis kann wie folgt sein: Eine Post-Anfrage kann mehrere Teile gemäß bestimmten Spezifikationen definieren;
Im Folgenden wird das Mobile-Mesh-Protokoll verwendet (tatsächlich enthält eine Anfrage zwei unabhängige XML-Inhalte, eine Head-XML und eine Body-XML), um zu veranschaulichen, wie Jersey zur Verarbeitung von Multipart verwendet wird. Der Hauptcode lautet wie folgt (der Server empfängt ihn zu Beginn). Ich wusste nicht, wie man den Code schreibt, und ich habe nicht herausgefunden, wie andere ihn geschrieben haben. Später, als ich wütend wurde, dekompilierte ich den Code des Pakets jersey-multipart-1.0.3.1.jar und schaute ihn mir an. und dann habe ich verstanden):
public static final String HeadFieldName = "xmlhead";
public static final String BodyFieldName = "xmlbody";
//Client sendet Code
öffentlicher statischer String-Beitrag (String-Kopf, String-Körper) löst eine BusinessException { aus
FormDataMultiPart multiPart = new FormDataMultiPart();
multiPart.field(RequestField.HeadFieldName, head, MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field(RequestField.BodyFieldName, body, MediaType.MULTIPART_FORM_DATA_TYPE);
return webResource.type("multipart/form-data").post(String.class, multiPart);
}
// Serverseite empfängt Code
@POST
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
öffentlicher String-Dienst (FormDataMultiPart multiPart) löst eine Ausnahme aus{
if(multiPart == null){
if(_logger.isErrorEnabled()){
_logger.error("die Anfrage FormDataMultiPart ist null");
}
throw new Exception("the request FormDataMultiPart is null");
}
List<RequestField> requestFields = new ArrayList<RequestField>();
for(BodyPart bodyPart : multiPart.getBodyParts()){
String fieldName = ((FormDataBodyPart)bodyPart).getName().trim();
if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
sonst if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
anders{
if(_logger.isWarnEnabled()){
_logger.warn("invalid fieldName:" + fieldName + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml version="1.0"kodierung="UTF-8"?>
<InterBOSS>
<Version>0100</Version>
<TestFlag>0</TestFlag>
<BIPType>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<ActionCode>0</ActionCode>
</BIPType>
<RoutingInfo>
<OrigDomain>IMPS</OrigDomain>
<RouteType>01</RouteType>
<Routing>
<HomeDomain>BOSS</HomeDomain>
<RouteValue>13810494631</RouteValue>
</Routing>
</RoutingInfo>
<TransInfo>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</TransInfo>
</InterBOSS>
--Boundary_1_30911772_1367997277472
Inhaltsdisposition: form-data;name="xmlbody"
Inhaltstyp: Multipart/Formulardaten
<?xml version="1.0"kodierung="UTF-8"?>
<InterBOSS>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<subscribeServInfo>
<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>
<accessMode>01</accessMode>
<feeType>2</feeType>
</subscribeServInfo>
</subscribeServiceReq>]]></SvcCont>
</InterBOSS>
--Boundary_1_30911772_1367997277472--