그렇다면 Http 프로토콜의 Multipart는 무엇입니까? 다음은 http 프로토콜 1.1에서 발췌한 내용입니다.
하나 이상의 서로 다른 데이터 세트가 단일 본문으로 결합되는 멀티파트 엔터티의 경우 엔터티의 헤더(헤더 필드)에 "멀티파트" 유형 필드가 나타나야 합니다. 본문은 하나 이상의 본문 부분으로 구성되어야 하며, 각 부분은 경계 구분선 앞에 오고 마지막 부분 뒤에는 끝 경계 구분선이 옵니다. 경계 구분선 다음으로 각 본문 부분은 헤더 필드, 빈 줄 및 본문으로 구성됩니다.
위의 설명은 작성하기가 다소 혼란스럽습니다. 그러나 간단히 이해하면 다음과 같습니다. 게시 요청은 특정 사양에 따라 여러 부분을 정의할 수 있습니다.
다음은 모바일 메시 프로토콜(실제로 요청에는 두 개의 독립적인 xml 콘텐츠인 head xml과 body xml이 포함됨)을 사용하여 Jersey를 사용하여 Multipart를 처리하는 방법을 보여줍니다. 주요 코드는 다음과 같습니다(서버는 처음에 이를 받습니다. 코드를 어떻게 작성하는지 모르고, 다른 사람들이 어떻게 작성했는지도 모르고 나중에 화가 나서 Jersey-multipart-1.0.3.1.jar 패키지의 코드를 디컴파일해서 살펴보니, 그리고 나는 이해했습니다):
공개 정적 최종 문자열 HeadFieldName = "xmlhead";
공개 정적 최종 문자열 BodyFieldName = "xmlbody";
//클라이언트가 코드를 보냅니다.
public static String post(String head, String body)에서 BusinessException이 발생합니다.
FormDataMultiPart multiPart = 새로운 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);
}
// 서버 측에서 코드를 수신합니다.
@우편
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
공용 문자열 서비스(FormDataMultiPart multiPart)에서 예외 발생{
if(multiPart == null){
if(_logger.isErrorEnabled()){
_logger.error("FormDataMultiPart 요청이 null입니다.");
}
throw new Exception("요청 FormDataMultiPart가 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)));
}
else if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
또 다른{
if(_logger.isWarnEnabled()){
_logger.warn("잘못된 fieldName:" + fieldName + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml version="1.0" 인코딩="UTF-8"?>
<인터보스>
<버전>0100</버전>
<TestFlag>0</TestFlag>
<BIP 유형>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<ActionCode>0</ActionCode>
</BIP유형>
<라우팅정보>
<OrigDomain>IMPS</OrigDomain>
<RouteType>01</RouteType>
<라우팅>
<HomeDomain>보스</HomeDomain>
<RouteValue>13810494631</RouteValue>
</라우팅>
</RoutingInfo>
<트랜스포포>
<세션ID>2013050815143783928824</세션ID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</TransInfo>
</인터보스>
--Boundary_1_30911772_1367997277472
콘텐츠 처리: form-data;name="xmlbody"
콘텐츠 유형: 다중 부분/양식 데이터
<?xml version="1.0" 인코딩="UTF-8"?>
<인터보스>
<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>
</인터보스>
--Boundary_1_30911772_1367997277472--