Ressourcen mit mehrteiligen Nachrichten implementieren

Eine mehrteilige Nachricht enthält eine oder mehrere Nachrichten innerhalb ihrer Struktur. Jeder Nachrichtenteil kann seinen eigenen Inhaltstyp haben. Mit IBM® Java™ API for RESTful Web Services (JAX-RS) können sie mehrteilige Nachrichten erstellen und konsumieren.

Informationen zu diesem Vorgang

IBM JAX-RS stellt Klassen von Apache Wink bereit, mit denen eine mehrteilige Anforderung und eine mehrteilige Antwort modelliert werden kann. Darüber hinaus umfasst IBM JAX-RS standardmäßig Entitätsprovider, die mehrteilige Nachrichten unterstützen. Diese Entitätsprovider können mehrteilige Klasseninstanzen serialisieren und entserialisieren, wenn der Inhaltstyp der Nachricht mit multipart/* kompatibel ist.

Um mehrteilige Nachrichten mit Apache-Wink-APIs verarbeiten zu können, müssen Sie definierte Klassen zur Darstellung der mehrteiligen Nachrichtentextentität verwenden.

Verwenden Sie die folgenden Klassen, um eine eingehende mehrteilige Anforderung darzustellen:
org.apache.wink.common.model.multipart.InMultiPart
org.apache.wink.common.model.multipart.BufferedInMultiPart

Verwenden Sie einen der Klassentypen für mehrteilige eingehende Anforderungen als Methodenparameter in Ihrer Ressourcenmethode. Die Klasse InMultiPart sendet die Anforderungsnachricht per Streaming, während die Klasse BufferedInMultiPart die gesamte Nachricht in den Speicher stellt. Das Streaming der Nachricht konsumiert weniger Speicher, doch Sie können nur einmal iterativ auf die Nachrichtenteile zugreifen. Im Gegensatz dazu können Sie, wenn Sie die Nachricht puffern, jeden Teil der Nachricht so oft anzeigen, wie Sie möchten.

Verwenden Sie die folgenden Klassen für die Darstellung einer abgehenden mehrteiligen Antwort:
org.apache.wink.common.model.multipart.OutMultiPart
org.apache.wink.common.model.multipart.BufferedOutMultiPart

Sie können eine Instanz eines der Typen der abgehenden mehrteiligen Nachrichten in Ihrer Ressourcenmethode zurückgeben. Die Klasse OutMultiPart sendet die mehrteilige Antwort per Streaming, während die Klasse BufferedOutMultiPart die gesamte Nachricht in den Speicher stellt.

Diese Klassen für mehrteilige ein- und abgehende Nachrichten verwenden JAX-RS-Entitätsprovider, um einzelne Teile der mehrteiligen Nachricht zu serialisieren und zu entserialisieren.

Weitere Informationen zu Klassen für mehrteilige Nachrichten finden Sie in der Dokumentation zur Apache-Wink-API.

Vorgehensweise

  1. Entscheiden Sie, welche Klasse Sie verwenden möchten: die Klasse, die mehrteilige Nachrichten per Streaming überträgt, oder die Klasse, die mehrteilige Nachrichten puffert. Wenn Sie festlegen, welche Implementierung mehrteiliger Nachrichten für Ihre Geschäftsanforderungen am besten geeignet ist, sollten Sie Leistungs- und funktionale Aspekte berücksichtigen.
  2. Wenn eine mehrteilige Nachricht empfangen wird, verwenden Sie eine der InMultiPart-Klassen, um die Anforderungsentität zu entserialisieren.
    Fügen Sie z. B. den Parameter InMultiPart zur Ressourcenmethode hinzu:
    @POST
    @Consumes("multipart/mixed")
    public void processMessage(InMultiPart inPart) {
    
    }
    Der folgende Codeausschnitt ist ein Beispiel für eine Anforderung, die für den Anforderungsheader "Content-Type" den Wert multipart/mixed;boundary=myboundary sowie einen Nachrichtentext hat:
    --myboundary
    Content-Type: text/plain
    MyCustomPartHeader: ThisIsTheGreetingPart
    
    Hello world
    --myboundary
    Content-Type: text/custom
    
    Bonjour
    --myboundary--
    Der folgende Codeausschnitt kann jeden Teil der mehrteiligen Nachricht lesen:
    @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. Wenn eine mehrteilige Nachricht gesendet werden muss, verwenden Sie eine der OutMultiPart-Klassen, um die Anforderungsentität zu serialisieren.
    Beispiel für die Rückgabe einer BufferedOutMultiPart-Instanz aus der Ressourcenmethode:
    @GET
    @Produces("multipart/mixed;boundary=myboundary")
    public BufferedOutMultiPart processMessage() {
        BufferedOutMultiPart mpout = new BufferedOutMultiPart();
        mpout.setBoundary("myboundary");
    
        /* erster Teil */
        OutPart op = new OutPart();
        op.setBody("Hello world");
        op.setContentType("text/plain");
        op.addHeader("MyCustomHeader", "ThisIsTheGreetingPart");
        mpout.addPart(op);
    
        /* zweiter Teil */
        op = new OutPart();
        byte[] binaryData = "Bonjour".getBytes("UTF-8");
        op.setBody(binaryData);
        op.setContentType("custom/binarytype");
        mpout.addPart(op);
        return mpout;
    }
    Der vorherige Antwortcode kann auf die Anforderung mit einer Nachricht wie im folgenden Codebeispiel antworten:
    --myboundary
    Content-Type: text/plain
    MyCustomHeader: ThisIsTheGreetingPart
    
    Hello world
    --myboundary
    Content-Type: custom/binarytype
    
    Bonjour
    --myboundary--

Ergebnisse

Sie können mehrteilige Nachrichten, die mehrere Inhaltstypen enthalten, empfangen und senden.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_multipartcontent_impl
Dateiname:twbs_jaxrs_multipartcontent_impl.html