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

Vous pouvez activer un client existant de services Web JAX-WS (Java™ API for XML-Based Web Services) afin que des informations définies par l'application puissent être envoyées en même temps que vos demandes de service web par le biais d'en-têtes de transport. En outre, vous pouvez activer un noeud final de services Web JAX-WS pour qu'il envoie des informations définies par l'application avec le message de réponse des Web à l'aide d'en-têtes de transport.

Avant de commencer

Vous avez besoin d'un client de services Web JAX-WS que vous pouvez activer pour envoyer des en-têtes de transport.

L'envoi d'en-têtes de transport est pris en charge par les clients de services Web JAX-WS, 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 l'envoi de valeurs dans les en-têtes de transport avec le message de demande de services Web. Une fois la propriété définie, les valeurs sont définies pour toutes les demandes liées aux appels de méthode distante ultérieurs sur l'objet BindingProvider jusqu'à ce que la propriété associée soit définie à null ou que l'objet BindingProvider soit supprimé.

Pour envoyer des valeurs dans des en-têtes de transport sur des demandes sortantes à partir d'une application client de services Web JAX-WS, modifiez le code client comme suit :

Procédure

  1. Créez un objet java.util.Map contenant les en-têtes de transport.
  2. Ajoutez une entrée à l'objet Map pour chaque en-tête de transport que le client doit envoyer.
    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 défini 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 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.
    2. Définissez la valeur de l'entrée Map à la valeur de l'en-tête de transport. Le type de cette valeur peut correspondre à l'un des types de données suivants :
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean
  3. Définissez l'objet Map sur l'objet RequestContext de BindingProvider à l'aide de la propriété com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES. Lorsque la valeur de la propriété REQUEST_TRANSPORT_PROPERTIES est définie, ce Map est utilisé dans les appels ultérieurs pour définir les valeurs d'en-tête dans les demandes sortantes. Si la valeur de la propriété REQUEST_TRANSPORT_PROPERTIES est null, aucune propriété de transport n'est envoyée dans les demandes sortantes. 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. Exécutez les appels de méthode distante pour l'instance BindingProvider. Les en-têtes et les valeurs associées de Map sont ajoutés à la demande sortante pour chaque appel de méthode. Si l'appel utilise HTTP, les en-têtes de transport sont envoyés en tant qu'en-têtes HTTP dans la demande HTTP. Si elle utilise JMS, les en-têtes sont envoyés en tant que propriétés de message JMS.
    Si la propriété Constants.REQUEST_TRANSPORT_PROPERTIES 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 :
    1. La valeur de la propriété Constants.REQUEST_TRANSPORT_PROPERTIES définie sur l'instance RequestContext de BindingProvider doit correspondre à un objet java.util.Map ou avoir la valeur null.
    2. Chaque valeur de la mappe doit correspondre à un type de données java.util.String.
    3. Chaque valeur de la mappe doit correspondre à l'un des types de données suivants :
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean

Résultats

Vous disposez d'un client de services Web JAX-WS configuré pour l'envoi d'en-têtes de transport dans les messages de demande des services Web.

Exemple

Voici un petit exemple de programmation illustrant la manière dont les en-têtes de transport des demandes sont envoyés 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 send transport headers on the request.
    public void invokeService() {

        // Set up the Map that will contain the request headers.
        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));

        // Set the Map as a property on the RequestContext.
        BindingProvider bp = (BindingProvider) port;
        bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES, requestHeaders);

        // Invoke the web services operation.
        String result = port.echoString(“Hello, world!”);
    }
}

Envoi d'en-têtes de transport de réponse à partir d'un noeud final JAX-WS

Avant de commencer

Vous avez besoin d'une classe d'implémentation de noeud final de services Web AX-WS que vous pouvez activer pour envoyer des en-têtes de transport.

L'envoi d'en-têtes de transport de réponse à partir d'un noeud final JAX-WS est similaire à l'envoi d'en-têtes de transport de demande à partir d'un client JAX-WS. Il est pris en charge pour les transports HTTP et JMS.

Pourquoi et quand exécuter cette tâche

Lors de l'utilisation du modèle de programmation JAX-WS, la classe d'implémentation de noeud final doit définir une propriété sur l'objet MessageContext pour l'envoi de valeurs dans les en-têtes de transport avec le message de réponse des services Web.

Procédure

  1. Créez un objet java.util.Map contenant les en-têtes de transport.
  2. Ajoutez une entrée (clé et valeur) à l'objet Map pour chaque en-tête de transport à envoyer dans le message de réponse. Cette procédure est similaire à celle du client.
  3. Extrayez l'objet MessageContext (instance de javax.xml.ws.handler.MessageContext) associé à l'appel du noeud final.
  4. Définissez l'objet Map sur l'objet MessageContext à l'aide de la propriété com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES.

Résultats

Vous disposez d'une classe d'implémentation de noeud final de services Web AX-WS configurée pour envoyer des en-têtes de transport dans les messages de réponse des services Web.

Exemple

Voici un petit exemple de programmation illustrant la manière dont les en-têtes de transport des réponses sont envoyés par une classe d'implémentation de noeud final de services Web JAX-WS :
@WebService
public class EchoServiceImpl implements EchoServicePortType {

    // Inject an instance of WebServiceContext so we can retrieve
    // the MessageContext for each invocation of this endpoint.
    @Resource
    WebServiceContext ctxt;

    /**
     * Default constructor.
     */
    public EchoServiceImpl() {
        ....
    }

    public String echoString(String input) {
        String result = “Echo result: “ + input;

        // Retrieve the MessageContext from the injected WebServiceContext.
        MessageContext mc = ctxt.getMessageContext();

        // Send some headers back in the response message.
        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));

        // Set the response header Map on the MessageContext.
        mc.put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);

        return result;
    }
}

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_cookiejaxws
Nom du fichier : twbs_cookiejaxws.html