Transportheader mit JAX-WS senden

Sie können einem vorhandenen JAX-WS-Web-Service-Client (Java™ API for XML-Based Web Services) ermöglichen, über Transportheader anwendungsdefinierte Informationen zusammen mit Ihren Web-Service-Anforderungen zu senden. Außerdem können Sie einen JAX-WS-Web-Service-Endpunkt für das Senden von anwendungsdefinierten Informationen zusammen mit der Web-Service-Antwortnachricht unter Verwendung von Transportheadern konfigurieren.

Vorbereitende Schritte

Sie benötigen einen JAX-WS-Web-Service-Client, den Sie für das Senden von Transportheadern konfigurieren können.

Das Senden von Transportheadern wird in JAX-WS-Web-Service-Clients und für die Transporte HTTP und JMS unterstützt. Der Web-Service-Client muss die JAX-WS-Anwendungsprogrammierschnittstellen direkt und nicht über zwischengeschaltete Schichten wie eine Gateway-Funktion aufrufen.

Informationen zu diesem Vorgang

Bei der Verwendung des Programmiermodells JAX-WS muss der Client eine Eigenschaft im RequestContext-Objekt des BindingProvides setzen, um Werte in Transportheadern mit der Web-Service-Anforderung zu senden. Nachdem Sie die Eigenschaft gesetzt haben, werden so lange Werte in allen Anforderungen für nachfolgende Remote-Methodenaufrufe für das BindingProvider-Objekt gesetzt, bis die zugeordnete Eigenschaft auf null gesetzt oder das BindingProvider-Objekt verworfen wird.

Wenn Sie in den Transportheadern abgehender Anforderungen von einer JAX-WS-Web-Service-Clientanwendung Werte senden möchten, müssen Sie den Clientcode wie folgt ändern:

Vorgehensweise

  1. Erstellen Sie ein Objekt des Typs java.util.Map, das die Transportheader enthält.
  2. Fügen Sie dem Map-Objekt für jeden Transportheader, den der Client senden soll, einen Eintrag hinzu.
    1. Geben Sie als Schlüssel für den Map-Eintrag eine Zeichenfolge an, die mit der Transportheader-ID exakt übereinstimmt. Sie können die Header-ID mit einem reservierten Headernamen definieren, z. B. als Cookie bei HTTP, oder Sie können eine benutzerdefinierte Header-ID wie MyTransportHeader verwenden. Bestimmte Header-IDs werden auf spezielle Weise verarbeitet, aber außer dem Wert für die Header-ID werden keine anderen Werte geprüft. Weitere Informationen zu den HTTP-Header-IDs, die speziell behandelt werden, finden Sie in den bewährten Verfahren für Transportheadereigenschaften. Allgemeine Zeichenfolgenkonstanten für Header-IDs, wie z. B. HTTP_HEADER_SET_COOKIE, sind in der Klasse "com.ibm.websphere.webservices.Constants" enthalten.
    2. Legen Sie als Wert für den Map-Eintrag den Wert des Transportheaders fest. Der Typ dieses Werts entspricht einem der folgenden Datentypen:
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean
  3. Legen Sie das Map-Objekt im RequestContext des BindingProvider-Objekts mit der Eigenschaft com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES fest. Wenn ein Wert für die Eigenschaft REQUEST_TRANSPORT_PROPERTIES definiert ist, wird dieser Map-Eintrag in nachfolgenden Aufrufen verwendet, um die Headerwerte in die abgehenden Anforderungen einzufügen. Wenn die Eigenschaft REQUEST_TRANSPORT_PROPERTIES auf null gesetzt ist, werden in abgehenden Anforderungen keine Transporteigenschaften gesendet. Weitere Informationen zu diesen Eigenschaften finden Sie in der Dokumentation zu den Transportheadereigenschaften.
  4. Setzen Sie die Remote-Methodenaufrufe für die BindingProvider-Instanz ab. Die Header und die zugehörigen Werte aus dem Map-Objekt werden der abgehenden Anforderung bei jedem Methodenaufruf hinzugefügt. Wenn HTTP für den Aufruf verwendet wird, werden die Transportheader als HTTP-Header in der HTTP-Anforderung gesendet. Wenn JMS für den Aufruf verwendet wird, werden die Transportheader als JMS-Nachrichteneigenschaften gesendet.
    Wenn die Eigenschaft Constants.REQUEST_TRANSPORT_PROPERTIES nicht ordnungsgemäß definiert ist, können API-Verwendungsfehler auftreten, die zu einem Fehler vom Typ "WebServiceException" führen. Die folgenden Voraussetzungen müssen erfüllt sein, oder der Prozess scheitert:
    1. Der Eigenschaftswert von Constants.REQUEST_TRANSPORT_PROPERTIES, der im RequestContext der BindingProvider-Instanz gesetzt ist, muss ein Objekt des Typs java.util.Map oder null sein.
    2. Jeder Schlüssel in der Map muss den Datentyp java.util.String haben.
    3. Jeder Wert in der Map muss einen der folgenden Datentypen haben:
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean

Ergebnisse

Sie haben einen JAX-WS-Web-Service-Client, der für das Senden von Transportheadern in Web-Service-Anforderungsnachrichten konfiguriert ist.

Beispiel

Nachfolgend ist ein kurzes Programmierbeispiel aufgeführt, in dem veranschaulicht wird, wie Transportheader in Anforderungen von einer JAX-WS-Web-Service-Clientanwendung gesendet werden:
public class MyApplicationClass {
    // Instanz des Porttyps des Service injizieren.
    @WebServiceRef(EchoService.class)
    private EchoPortType port;

    // Diese Methode ruft die Web-Service-Operation auf und sendet Transportheader in der Anforderung ab.
    public void invokeService() {

        // Map konfigurieren, die die Anforderungsheader enthält.
        Map<String, Object> requestHeaders = new HashMap<String, Object>();
        requestHeaders.put(“MyHeader1”, “This is a string value”);
        requestHeaders.put(“MyHeader2”, new Integer(33));
        requestHeaders.put(“MyHeader3”, new Boolean(true));

        // Map als Eigenschaft im RequestContext setzen.
        BindingProvider bp = (BindingProvider) port;
        bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES, requestHeaders);

        // Web-Service-Operation aufrufen.
        String result = port.echoString(“Hello, world!”);
    }
}

Transportheader in Antworten von einem JAX-WS-Endpoint senden

Vorbereitende Schritte

Sie benötigen eine Implementierungsklasse des einen JAX-WS-Web-Service-Endpunkts, die Sie für das Senden von Transportheadern konfigurieren können.

Das Senden von Transportheadern in Antworten von einem JAX-WS-Endpunkt ähnelt dem Senden von Transportheadern in Anforderungen von einem JAX-WS-Client. Dies wird für HTTP- und JMS-Transporte unterstützt.

Informationen zu diesem Vorgang

Bei der Verwendung des Programmiermodells JAX-WS muss die Implementierungsklasse des Endpunkts eine Eigenschaft im MessageContext setzen, um Werte in Transportheadern mit der Web-Service-Antwortnachricht zu senden.

Vorgehensweise

  1. Erstellen Sie ein Objekt des Typs java.util.Map, das die Transportheader enthält.
  2. Fügen Sie dem Map-Objekt für jeden Transportheader, der in der Antwortnachricht gesendet werden soll, einen Eintrag (Schlüssel und Wert) hinzu. Dies ist ähnlich wie die vorherige Prozedur für den Client.
  3. Rufen Sie den MessageContext (Instanz von javax.xml.ws.handler.MessageContext) ab, der dem Aufruf des Endpunkts zugeordnet ist.
  4. Legen Sie das Map-Objekt im MessageContext mit der Eigenschaft com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES fest.

Ergebnisse

Sie haben eine Implementierungsklasse des einen JAX-WS-Web-Service-Endpunkts, die für das Senden von Transportheadern in WEb-Service-Antwortnachrichten konfiguriert ist.

Beispiel

Nachfolgend ist ein kurzes Programmierbeispiel aufgeführt, in dem veranschaulicht wird, wie Transportheader von der Implementierungsklasse eines JAX-WS-Web-Service-Endpunkts gesendet werden:
@WebService
public class EchoServiceImpl implements EchoServicePortType {

    // Instanz von WebServiceContext injizieren, damit der
    // MessageContext für jeden Aufruf dieses Endpunkts abgerufen werden kann.
    @Resource
    WebServiceContext ctxt;

    /**
     * Standardkonstruktor
     */
    public EchoServiceImpl() {
        ....
    }

    public String echoString(String input) {
        String result = “Echo result: “ + input;

        // MessageContext aus dem injizierten WebServiceContext abrufen
        MessageContext mc = ctxt.getMessageContext();

        // Einige Header in der Antwortnachricht zurücksenden.
        Map<String, Object> responseHeaders = new HashMap<String, Object>();
        responseHeaders.put("MyHeader1", "This is a string response value");
        responseHeaders.put("MyHeader2", new Integer(33));
        responseHeaders.put("MyHeader3”, new Boolean(false));

        // Antwort-Header-Map im MessageContext setzen.
        mc.put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);

        return result;
    }
}

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_cookiejaxws
Dateiname:twbs_cookiejaxws.html