Transportheader mit JAX-WS abrufen

Sie können einen JAX-WS-Web-Service-Client (Java™ API for XML-Based Web Services) so einstellen, dass er Werte aus Transportheadern abzurufen kann. Bei HTTP-Anforderungen werden die Transportheader aus den HTTP-Headern in der HTTP-Antwortnachricht abgerufen. Bei JMS-Anforderungen (Java Message Service) werden die Transportheader aus den JMS-Nachrichteneigenschaften in der JMS-Antwortnachricht abgerufen.

Vorbereitende Schritte

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

Das Abrufen von Transportheadern wird nur von Web-Service-Clients 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 Objekt RequestContext des BindingProviders setzen, um Werte aus den Transportheadern abzurufen. Nachdem Sie die Eigenschaft gesetzt haben, werden so lange Werte aus Antworten für die nachfolgenden Methodenaufrufe für das BindingProvider-Objekt gelesen, bis die zugeordnete Eigenschaft auf null gesetzt oder das BindingProvider-Objekt verworfen wird.

Wenn Sie Werte aus den Transportheadern in eingehenden Antworten abrufen möchten, müssen Sie den Clientcode wie folgt ändern:

Vorgehensweise

  1. Erstellen Sie ein Objekt des Typs java.util.Map, das die aus der Antwortnachricht abgerufenen Transportheader enthalten soll. Zum Abrufen aller Tansport-Header aus einer Antwortnachricht lassen Sie diese Map leer.
  2. (Optional) Fügen Sie der Map für jeden Header, dessen Wert Sie aus der ankommenden Antwortnachricht abrufen möchten, 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 angeben, z. B. als Cookie bei HTTP, oder Sie können eine benutzerdefinierte Header-ID wie MyTransportHeader verwenden. Bestimmte Header-IDs werden auf eine ganz bestimmte Weise verarbeitet, aber es werden keine weiteren Prüfungen zur Bestätigung der Header-ID durchgeführt. 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. Der Map-Eintragswert wird ignoriert und muss nicht gesetzt werden. Ein leeres Map-Objekt, z. B. eines, das nicht null ist, aber keine Schlüssel enthält, bewirkt, dass alle Transportheader in der Antwort abgerufen werden.
  3. Legen Sie das Map-Objekt im RequestContext des BindingProvider-Objekts mit der Eigenschaft com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES fest. Wenn das Map-Objekt definiert ist, wird die Eigenschaft RESPONSE_TRANSPORT_PROPERTIES in den nachfolgenden Aufrufen verwendet, um die Header aus den Antworten abzurufen. Wenn Sie die Eigenschaft auf null setzen, werden keine Header aus der Antwort abgerufen. 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 Werte aus den angegebenen Transportheadern werden aus der Antwortnachricht abgerufen und in die Map gestellt.
    Wenn die Eigenschaft 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:
    • Der Eigenschaftswert von Constants.RESPONSE_TRANSPORT_PROPERTIES, der im RequestContext der BindingProvider-Instanz gesetzt ist, darf weder null noch eine Instanz von java.util.Map sein.
    • Alle Map-Schlüssel müssen den Datentyp java.lang.String haben, und die Schlüssel dürfen nicht null sein.
    • Die Map kann leer sein, d. h., sie enthält überhaupt keine Einträge. In diesem Fall werden alle Antwortheader aus der Antwortnachricht abgerufen.

Ergebnisse

Sie haben einen JAX-WS-Web-Service, der Transportheader aus eingehenden Antwortnachrichten abrufen kann.

Beispiel

Nachfolgend ist ein kurzes Programmierbeispiel aufgeführt, in dem veranschaulicht wird, wie Transportheader von einer JAX-WS-Web-Service-Clientanwendung abgerufen 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 ruft Transportheader in der Anforderung ab.
    public void invokeService() {

        // Map zum Abrufen von Antwortheadern einrichten.
        Map<String, Object> responseHeaders = new HashMap<String, Object>;
        responseHeaders.put(“MyHeader1”, null);
        responseHeaders.put(“MyHeader2”, null);
        responseHeaders.put(“MyHeader3”, null);

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

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

        // Jetzt die Antwortheader abrufen.
        Object header1 = responseHeaders.get(“MyHeader1”);
        Object header2 = responseHeaders.get(“MyHeader2”);
        Object header3 = responseHeaders.get(“MyHeader3”);

    }
}

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_retrievecookiejaxws
Dateiname:twbs_retrievecookiejaxws.html