إذن ما هو Multipart في بروتوكول Http؟ ما يلي مقتطف من بروتوكول http 1.1:
في حالة الكيان متعدد الأجزاء، حيث يتم دمج مجموعة بيانات مختلفة واحدة أو أكثر في نص واحد، يجب أن يظهر حقل من النوع "متعدد الأجزاء" في رأس الكيان (حقل الرأس). يجب أن يتكون الجسم من جزء أو أكثر من أجزاء الجسم، كل جزء يسبقه خط حد، والأخير يتبعه خط حد نهائي. بعد الخط المحدد للحدود، يتكون كل جزء من النص من حقول رأس وأسطر فارغة ونص.
الوصف أعلاه مربك بعض الشيء عند كتابته، لكن الفهم البسيط يمكن أن يكون كما يلي: يمكن لطلب النشر تحديد أجزاء متعددة وفقًا لمواصفات معينة؛
يستخدم ما يلي بروتوكول الشبكة المتنقلة (في الواقع، يتضمن الطلب محتويات xml مستقلة، رأس xml ونص xml) لتوضيح كيفية استخدام Jersey لمعالجة الأجزاء المتعددة. الرمز الرئيسي هو كما يلي (يستقبله الخادم في البداية لم أكن أعرف كيفية كتابة الكود، ولم أعرف كيف كتبه الآخرون. لاحقًا، عندما غضبت، قمت بفك شفرة حزمة Jersey-multipart-1.0.3.1.jar ونظرت إليها. وبعدين فهمت):
السلسلة النهائية العامة الثابتة HeadFieldName = "xmlhead";
السلسلة النهائية العامة الثابتة BodyFieldName = "xmlbody";
// يرسل العميل الرمز
منشور سلسلة ثابتة عامة (رأس السلسلة، نص السلسلة) يطرح BusinessException {
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);
}
// يتلقى جانب الخادم الرمز
@بريد
@Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
@Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
خدمة السلسلة العامة (FormDataMultiPart multiPart) تطرح استثناءً {
إذا (متعدد الأجزاء == فارغ){
إذا (_logger.isErrorEnabled()){
_logger.error("الطلب FormDataMultiPart فارغ");
}
طرح استثناء جديد("الطلب FormDataMultiPart فارغ");
}
List<RequestField> requestFields = new ArrayList<RequestField>();
for(BodyPart bodyPart : multiPart.getBodyParts()){
String fieldName = ((FormDataBodyPart)bodyPart).getName().trim();
إذا(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
آخر إذا(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
}
آخر{
إذا(_logger.isWarnEnabled()){
_logger.warn("اسم الحقل غير صالح:" + fieldName + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
.....
}
<?xml version="1.0" encoding="UTF-8"?>
<إنتربوس>
<الإصدار>0100</الإصدار>
<TestFlag>0</TestFlag>
<نوع بيبتي>
<BIPCode>BIP2B543</BIPCode>
<ActivityCode>T2001543</ActivityCode>
<ActionCode>0</ActionCode>
</BIPType>
<معلومات التوجيه>
<OrigDomain>IMPS</OrigDomain>
<RouteType>01</RouteType>
<التوجيه>
<HomeDomain>BOSS</HomeDomain>
<RouteValue>13810494631</RouteValue>
</التوجيه>
</معلومات التوجيه>
<ترانس إنفو>
<SessionID>2013050815143783928824</SessionID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</ترانس إنفو>
</إنتربوس>
--Boundary_1_30911772_1367997277472
التصرف في المحتوى: بيانات النموذج؛ الاسم = "xmlbody"
نوع المحتوى: بيانات متعددة الأجزاء/النموذج
<?xml version="1.0" encoding="UTF-8"?>
<إنتربوس>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<الاشتراك في معلومات الخدمة>
<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--