では、HTTP プロトコルのマルチパートとは何でしょうか?以下は http プロトコル 1.1 からの抜粋です。
1 つ以上の異なるデータ セットが 1 つの本文に結合されるマルチパート エンティティの場合、エンティティのヘッダー (ヘッダー フィールド) に「マルチパート」タイプのフィールドが表示される必要があります。本文は 1 つ以上の本文部分で構成され、各部分の前に境界区切り線があり、最後の部分の後に終了境界区切り線が続きます。境界区切り線の後の各本文部分は、ヘッダー フィールド、空白行、および本文で構成されます。
上記の説明は書くのが少しわかりにくいですが、簡単に理解すると次のようになります。ポストリクエストは特定の仕様に従って複数の部分を定義できます。
以下では、モバイル メッシュ プロトコル (実際には、リクエストにはヘッド XML とボディ XML という 2 つの独立した XML コンテンツが含まれます) を使用して、Jersey を使用して Multipart を処理する方法を示します。メイン コードは次のとおりです (サーバーは最初にそれを受け取ります)。私はコードの書き方がわからず、他の人がどのようにコードを書いたかも知りませんでした。後で、腹が立ってjersey-multipart-1.0.3.1.jarパッケージのコードを逆コンパイルして見てみたところ、そして私は理解しました):
public static Final String HeadFieldName = "xmlhead";
public static Final String BodyFieldName = "xmlbody";
//クライアントがコードを送信
public static String post(String head, String body) throws 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})
public String サービス (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()){
文字列フィールド名 = ((FormDataBodyPart)bodyPart).getName().trim();
if(フィールド名.equalsIgnoreCase(リクエストフィールド.ヘッドフィールド名)){
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("無効なフィールド名:" + フィールド名 + ",originXml:" + bodyPart.getEntityAs(String.class));
}
}
}
……
}
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<インターボス>
<バージョン>0100</バージョン>
<テストフラグ>0</テストフラグ>
<BIPタイプ>
<BIPコード>BIP2B543</BIPコード>
<アクティビティコード>T2001543</アクティビティコード>
<アクションコード>0</アクションコード>
</BIPタイプ>
<ルーティング情報>
<OrigDomain>IMPS</OrigDomain>
<ルートタイプ>01</ルートタイプ>
<ルーティング>
<ホームドメイン>BOSS</ホームドメイン>
<RouteValue>13810494631</RouteValue>
</ルーティング>
</ルーティング情報>
<トランス情報>
<セッションID>2013050815143783928824</セッションID>
<TransIDO>2013050815143783928824</TransIDO>
<TransIDOTime>20130508151437</TransIDOTime>
</トランス情報>
</インターボス>
--Boundary_1_30911772_1367997277472
Content-Disposition: form-data;name="xmlbody"
コンテンツ タイプ: multipart/form-data
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<インターボス>
<SvcCont><![CDATA[<subscribeServiceReq>
<msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
<subscribeServInfo>
<oprTime>20130508151436</oprTime>
<アクションID>06</アクションID>
<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>
<アクセスモード>01</アクセスモード>
<feeType>2</feeType>
</subscribeServInfo>
</subscribeServiceReq>]]></SvcCont>
</インターボス>
--Boundary_1_30911772_1367997277472--