Vous pouvez activer un client de services JAX-WS (Java API for XML-Based Web Services) pour extraire des valeurs dans des en-têtes de transport. Pour une demande qui utilise le protocole HTTP, les en-têtes de transport sont extraits à partir des en-têtes HTTP présents dans le message de réponse HTTP. Pour une demande qui utilise le JMS (Java™ Message Service), les en-têtes de transport sont extraits à partir des propriétés de message JMS présentes dans le message de réponse JMS.
Avant de commencer
Vous avez besoin d'un client de services Web JAX-WS que vous pouvez activer
pour extraire des en-têtes de transport.
L'extraction d'en-têtes de transport est
prise en charge uniquement par des clients de services Web, et pour les transports HTTP et JMS. Le client de services web
doit appeler directement les API JAX-WS et ne pas passer par les couches
intermédiaires comme la fonction de passerelle.
Pourquoi et quand exécuter cette tâche
Lors de l'utilisation du modèle de programmation JAX-WS, le client
doit définir une propriété sur l'objet RequestContext de BindingProvider pour extraire les
valeurs contenues dans les en-têtes de transport. Une fois la propriété définie, les valeurs sont lues à partir des réponses aux appels de méthode ultérieurs par rapport à l'objetBindingProvider jusqu'à ce que la propriété associée soit définie à null ou que l'objet BindingProvider soit supprimé.
Pour extraire des valeurs des en-têtes de transport sur des réponses entrantes, modifiez le code client comme suit :
Procédure
- Créez un objet java.util.Map qui contiendra les en-têtes de transport
extraits du message de réponse. Pour extraire tous les en-têtes de transport d'un message de
réponse, laissez cette mappe vide.
- (Facultatif) Ajoutez une entrée à la mappe de chaque en-tête à extraire
du message de réponse entrant.
- Définissez la clé d'entrée Map en une chaîne correspondant exactement
à l'identificateur de l'en-tête de transport. L'identificateur d'en-tête peut être spécifié comme un nom d'en-tête
réservé, comme Cookie dans le cas du HTTP, ou défini par l'utilisateur, par
exemple MyTransportHeader.
Certains identificateurs d'en-tête sont traités de manière unique, mais
aucune autre vérification n'est effectuée pour confirmer la valeur des identificateurs d'en-tête. Pour plus de détails sur les
identificateurs d'en-tête HTTP, voir les rubriques relatives aux valeurs recommandées pour les propriétés d'en-tête. Vous pouvez définir des constantes de chaînes d'identificateur d'en-têtes courantes, telles que HTTP_HEADER_SET_COOKIE figurant dans la classe com.ibm.websphere.webservices.Constants. Il n'est pas nécessaire de définir la valeur d'entrée de mappe car elle est
ignorée. Une mappe vide (par exemple non null, mais qui ne contient aucune
clé) entraîne l'extraction de tous les en-têtes de la réponse.
- Définissez l'objet Map sur l'objet RequestContext de BindingProvider à
l'aide de la propriété com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES. Lorsque la mappe est définie, la propriété RESPONSE_TRANSPORT_PROPERTIES est
utilisée dans des appels ultérieurs pour extraire les en-têtes contenus dans les
réponses. Si vous attribuez la valeur null à la propriété, aucun en-tête ne sera extrait
de la réponse. Pour plus de détails sur ces propriétés, voir la documentation sur les propriétés d'en-têtes de transport.
- Appelez les appels de méthode distante pour l'instance BindingProvider. Les valeurs des en-têtes de transport spécifiés sont extraites du message
de réponse, puis placées dans la mappe.
Si la propriété n'est pas définie correctement, des erreurs liées à l'utilisation de l'API
peuvent se produire et générer une erreur WebServiceException. Les exigences suivantes doivent être remplies, faute de quoi le processus échouera :
- La valeur de la propriété Constants.RESPONSE_TRANSPORT_PROPERTIES définie
sur l'instance RequestContext de BindingProvider doit être
null ou correspondre à une instance de java.util.Map.
- Toutes les clés Map doivent être du type de données java.lang.String et les
clés ne doivent pas être null.
- La mappe peut être vide, ce qui signifie qu'elle ne contient aucune entrée. Dans
ce cas, tous les en-têtes de transport sont extraits du message de réponse.
Résultats
Vous disposez d'un service Web JAX-WS qui peut recevoir des en-têtes de transport à partir de messages de réponse entrants.
Exemple
Voici un petit exemple de programmation illustrant la manière dont les
en-têtes de transport des réponses sont extraits par une application client de
services Web JAX-WS :
public class MyApplicationClass {
// Inject an instance of the service's port-type.
@WebServiceRef(EchoService.class)
private EchoPortType port;
// This method will invoke the web service operation and retrieve transport headers on the request.
public void invokeService() {
// Set up the Map to retrieive our response headers.
Map<String, Object> responseHeaders = new HashMap<String, Object>;
responseHeaders.put(“MyHeader1”, null);
responseHeaders.put(“MyHeader2”, null);
responseHeaders.put(“MyHeader3”, null);
// Set the Map as a property on the RequestContext.
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);
// Invoke the web services operation.
String result = port.echoString(“Hello, world!”);
// Now retrieve our response headers.
Object header1 = responseHeaders.get(“MyHeader1”);
Object header2 = responseHeaders.get(“MyHeader2”);
Object header3 = responseHeaders.get(“MyHeader3”);
}
}