Extraction d'en-têtes de transport avec JAX-WS

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

  1. 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.
  2. (Facultatif) Ajoutez une entrée à la mappe de chaque en-tête à extraire du message de réponse entrant.
    1. 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.
  3. 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.
  4. 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”);

    }
}

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_retrievecookiejaxws
Nom du fichier : twbs_retrievecookiejaxws.html