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
- 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.
- (Optional) Fügen Sie der Map für jeden Header, dessen Wert Sie aus der ankommenden Antwortnachricht abrufen möchten,
einen Eintrag hinzu.
- 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.
- 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.
- 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”);
}
}