Так что же такое Multipart в протоколе Http? Ниже приведен отрывок из протокола http 1.1:
В случае составной сущности, где один или несколько различных наборов данных объединены в одно тело, в заголовке сущности (поле заголовка) должно появиться поле типа «составная». Тело должно состоять из одной или нескольких частей тела, каждая из которых предшествует строке-разделителю границы, а последняя, за которой следует конечная линия-разделитель границы. После линии-разделителя границы каждая часть тела состоит из полей заголовка, пустых строк и тела.
Приведенное выше описание немного сбивает с толку, но простое понимание может быть следующим: почтовый запрос может определять несколько частей в соответствии с определенными спецификациями;
Ниже используется протокол мобильной сетки (на самом деле запрос включает в себя два независимых XML-содержимого: заголовок и XML-файл тела), чтобы проиллюстрировать, как использовать Джерси для обработки Multipart. Основной код выглядит следующим образом (сервер получает его в начале). Я не знал, как писать код, и не знал, как его написали другие. Позже, когда я разозлился, я декомпилировал код пакета jersey-multipart-1.0.3.1.jar и посмотрел на него. и тут я понял):
public static Final String HeadFieldName = "xmlhead";
public static Final String BodyFieldName = "xmlbody";
//Клиент отправляет код
общедоступное статическое сообщение String (заголовок строки, тело строки) выдает BusinessException {
FormDataMultiPart multiPart = новый FormDataMultiPart();
multiPart.field(RequestField.HeadFieldName, head, MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field(RequestField.BodyFieldName, тело, MediaType.MULTIPART_FORM_DATA_TYPE);
return webResource.type("multipart/form-data").post(String.class, multiPart);
}
// Серверная часть получает код
@ПОЧТА
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
служба общедоступных строк (FormDataMultiPart multiPart) выдает исключение {
если (multiPart == ноль) {
если (_logger.isErrorEnabled()) {
_logger.error("запрос FormDataMultiPart имеет значение null");
}
throw new Exception("запрос FormDataMultiPart имеет значение null");
}
List<RequestField> requestFields = новый ArrayList<RequestField>();
for(BodyPart bodyPart : multiPart.getBodyParts()){
Строковое имя поля = ((FormDataBodyPart)bodyPart).getName().trim();
если (fieldName.equalsIgnoreCase (RequestField.HeadFieldName)) {
requestFields.add(новый RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
иначе, если(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(новый RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
еще{
если (_logger.isWarnEnabled()) {
_logger.warn("недопустимое имя поля:" + имя поля + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml version="1.0"coding="UTF-8"?>
<ИнтерБОСС>
<Версия>0100</Версия>
<TestFlag>0</TestFlag>
<ТипБИП>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<ActionCode>0</ActionCode>
</BIPТип>
<Информация о маршрутизации>
<OrigDomain>IMPS</OrigDomain>
<RouteType>01</RouteType>
<Маршрутизация>
<HomeDomain>БОСС</HomeDomain>
<RouteValue>13810494631</RouteValue>
</Маршрутизация>
</Информация о маршрутизации>
<ТрансИнфо>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</ТрансИнфо>
</ИнтерБОСС>
--Boundary_1_30911772_1367997277472
Content-Disposition: form-data;name="xmlbody"
Тип контента: multipart/form-data
<?xml version="1.0"coding="UTF-8"?>
<ИнтерБОСС>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<подпискаServInfo>
<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>
</ИнтерБОСС>
--Boundary_1_30911772_1367997277472--