複数パーツ・メッセージを使用したリソースの実装

複数パーツ・メッセージには、その構造に 1 つ以上の他のメッセージが含まれます。メッセージの各部分に、それぞれ独自のコンテンツ・タイプを含めることができます。 IBM® Java™ API for RESTful Web Services (JAX-RS) を使用すると、複数パーツ・メッセージを作成および取り込むことができます。

このタスクについて

IBM JAX-RS は、複数パーツ要求および複数パーツ応答をモデル化する Apache Wink のクラスを提供します。さらに IBM JAX-RS には、複数パーツ・メッセージをサポートするエンティティー・プロバイダーがデフォルトで含まれます。 これらのエンティティー・プロバイダーは、メッセージ・コンテンツ・タイプに multipart/* との互換性があれば、複数パーツ・クラス・インスタンスをシリアライズおよびデシリアライズすることができます。

Apache Wink API を使用して複数パーツ・メッセージを処理するには、定義クラスを使用して、複数パーツ・メッセージのメッセージ本体エンティティーを表示する必要があります。

次のクラスを使用すると、着信した複数パーツ要求を示すことができます。
org.apache.wink.common.model.multipart.InMultiPart
org.apache.wink.common.model.multipart.BufferedInMultiPart

着信した複数パーツ要求のクラス・タイプの 1 つを、リソース・メソッドのメソッド・パラメーターとして使用します。InMultiPart クラスによって要求メッセージがストリームされる一方で、BufferedInMultiPart クラスによってメッセージ全体がメモリーに保管されます。メッセージをストリーミングすると消費メモリーが減りますが、メッセージ部分にアクセスできるのは、1 回の反復操作につき 1 回のみです。対照的に、バッファリングを使用すると、メッセージのいずれの部分でも常時読み取ることができます。

次のクラスを使用すると、アウトバウンドの複数パーツ応答を示すことができます。
org.apache.wink.common.model.multipart.OutMultiPart
org.apache.wink.common.model.multipart.BufferedOutMultiPart

アウトバウンドの複数パーツ応答タイプの 1 つのインスタンスをリソース・メソッドに戻すことができます。OutMultiPart クラスによって複数パーツ応答メッセージがストリームされる一方で、BufferedOutMultiPart クラスによってメッセージ全体がメモリーに保管されます。

これらの複数パーツのインバウンド・クラスとアウトバウンド・クラスでは、JAX-RS エンティティー・プロバイダーを使用することで、複数パーツ・メッセージの個別部分がシリアライズまたはデシリアライズされます。

複数パーツ・メッセージ・クラスについて詳しくは、Apache Wink API 文書を参照してください。

手順

  1. メッセージをストリームする複数パーツ・クラスを使用するか、メッセージをバッファーする複数パーツ・クラスを使用するかを決定します。 ご自身のビジネス・ニーズに最適な複数パーツ・メッセージ実装を判断する際に、効率およびケイパビリティーを考慮してください。
  2. 複数パーツ・メッセージを受信した場合、InMultiPart クラスの 1 つを使用して要求エンティティーをデシリアライズします。
    例えば、次のように InMultiPart パラメーターをリソース・メソッドに追加します。
    @POST
    @Consumes("multipart/mixed")
    public void processMessage(InMultiPart inPart) {
    
    }
    次のコード・スニペットは、Content-Type 要求ヘッダー値が multipart/mixed;boundary=myboundary でメッセージ本体を含む要求の例です。
    --myboundary
    Content-Type: text/plain
    MyCustomPartHeader: ThisIsTheGreetingPart
    
    Hello world
    --myboundary
    Content-Type: text/custom
    
    Bonjour
    --myboundary--
    次のコード例では、複数パーツ・メッセージの各部分を読み取ることができます。
    @POST
    @Consumes("multipart/mixed")
    public void processMessage(InMultiPart inMultiPart) throws IOException {
        int counter = 0;
        while(inMultiPart.hasNext()) {
            counter++;
            InPart part = inMultiPart.next();
            System.out.println("The part number is: " + counter);
            System.out.println("The content type is: " + part.getContentType());
            System.out.println("The content body is: " + part.getBody(String.class, String.class));
            System.out.println("The content headers are: " + part.getHeaders());
        }
    }
  3. 複数パーツ・メッセージを送信する必要がある場合、OutMultiPart クラスの 1 つを使用して要求エンティティーをシリアライズします。
    例えば、次のように BufferedOutMultiPart インスタンスをリソース・メソッドから戻します。
    @GET
    @Produces("multipart/mixed;boundary=myboundary")
    public BufferedOutMultiPart processMessage() {
        BufferedOutMultiPart mpout = new BufferedOutMultiPart();
        mpout.setBoundary("myboundary");
    
        /* first part */
        OutPart op = new OutPart();
        op.setBody("Hello world");
        op.setContentType("text/plain");
        op.addHeader("MyCustomHeader", "ThisIsTheGreetingPart");
        mpout.addPart(op);
    
        /* second part */
        op = new OutPart();
        byte[] binaryData = "Bonjour".getBytes("UTF-8");
        op.setBody(binaryData);
        op.setContentType("custom/binarytype");
        mpout.addPart(op);
        return mpout;
    }
    前述の応答コードは、次のコード例のようなメッセージを含めて要求に応答することができます。
    --myboundary
    Content-Type: text/plain
    MyCustomHeader: ThisIsTheGreetingPart
    
    Hello world
    --myboundary
    Content-Type: custom/binarytype
    
    Bonjour
    --myboundary--

タスクの結果

複数のコンテンツ・タイプを含む複数パーツ・メッセージを送受信できます。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_multipartcontent_impl
ファイル名:twbs_jaxrs_multipartcontent_impl.html