Então, qual é o Multipart no protocolo HTTP? A seguir está um trecho do protocolo http 1.1:
No caso de uma entidade multipartes, onde um ou mais conjuntos de dados diferentes são combinados em um único corpo, um campo do tipo “multipart” deve aparecer no cabeçalho da entidade (campo de cabeçalho). O corpo deve consistir em uma ou mais partes do corpo, cada uma precedendo uma linha delimitadora de limite e a última seguida por uma linha delimitadora final de limite. Após sua linha delimitadora de limite, cada parte do corpo consiste em campos de cabeçalho, linhas em branco e corpo.
A descrição acima é um pouco confusa de escrever, mas uma compreensão simples pode ser a seguinte: uma solicitação de postagem pode definir várias partes de acordo com certas especificações;
O seguinte usa o protocolo de malha móvel (na verdade, uma solicitação inclui dois conteúdos xml independentes, um xml principal e um xml corporal) para ilustrar como usar Jersey para processar Multipart. O código principal é o seguinte (o servidor o recebe no início. Eu não sabia como escrever o código e não descobri como outros o escreveram. Mais tarde, quando fiquei com raiva, descompilei o código do pacote jersey-multipart-1.0.3.1.jar e olhei para ele. e então eu entendi):
public static final String HeadFieldName = "xmlhead";
public static final String BodyFieldName = "xmlbody";
//Cliente envia código
public static String post(String head, String body) lança BusinessException {
FormDataMultiPart multiPart = new FormDataMultiPart();
multiPart.field(RequestField.HeadFieldName, head, MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field(RequestField.BodyFieldName, corpo, MediaType.MULTIPART_FORM_DATA_TYPE);
return webResource.type("multipart/form-data").post(String.class, multiPart);
}
//O lado do servidor recebe o código
@PUBLICAR
@Produz({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
serviço de string pública (FormDataMultiPart multiPart) lança exceção {
if(multiPart == null){
if(_logger.isErrorEnabled()){
_logger.error("a solicitação FormDataMultiPart é nula");
}
throw new Exception("a solicitação FormDataMultiPart é nula");
}
List<RequestField> requestFields = new ArrayList<RequestField>();
for(BodyPart bodyPart : multiPart.getBodyParts()){
String nomeDoCampo = ((FormDataBodyPart)bodyPart).getName().trim();
if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
senão if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
outro{
if(_logger.isWarnEnabled()){
_logger.warn("nomecampo inválido:" + nomecampo + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml versão="1.0" codificação="UTF-8"?>
<InterBOSS>
<Versão>0100</Versão>
<TestFlag>0</TestFlag>
<TipoBIP>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<ActionCode>0</ActionCode>
</BIPType>
<Informações de rota>
<OrigDomain>IMPS</OrigDomain>
<RouteType>01</RouteType>
<Roteamento>
<HomeDomain>CHEFE</HomeDomain>
<RouteValue>13810494631</RouteValue>
</Roteamento>
</RoutingInfo>
<TransInfo>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</TransInfo>
</InterBOSS>
--Limite_1_30911772_1367997277472
Disposição de conteúdo: form-data;name="xmlbody"
Tipo de conteúdo: multipart/form-data
<?xml versão="1.0" codificação="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>
--Limite_1_30911772_1367997277472--