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
Ergebnisse
Sie haben einen JAX-WS-Web-Service-Client, der für das Senden von Transportheadern in Web-Service-Anforderungsnachrichten konfiguriert ist.
Beispiel
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
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
Vorgehensweise
- Erstellen Sie ein Objekt des Typs java.util.Map, das die Transportheader enthält.
- 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.
- Rufen Sie den MessageContext (Instanz von javax.xml.ws.handler.MessageContext) ab, der dem Aufruf des Endpunkts zugeordnet ist.
- Legen Sie das Map-Objekt im MessageContext mit der Eigenschaft com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES fest.
Ergebnisse
Beispiel
@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;
}
}