IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

[Axis][WSDL2Java] Customisation des Headers SOAP


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Par défaut [Axis][WSDL2Java] Customisation des Headers SOAP
    Bonjour,

    Je suis en train d'essayé de réaliser le portage d'une application Windows écrit en .Net qui consome et fournit des web-services vers Linux via Java. J'ai donc générer les classes du web service à partir du fichier WSDL de la version .NET via WSDL2Java. Tout c'est bien déroulé, le webservice marche... Mais j'ai un petit problème: on peu apparement customiser facilement les entêtes SOAP en .NET, je voudrais savoir comment customiser les entêtes SOAP en Java dans le code généré automatiquement?

    Voici le code .net d'une Web Méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            /// <summary>
            /// Trigger d'évènement(s)
            /// </summary>
            [WebMethod(Description = "Trigger d'évènement(s)")]
            [SoapHeader("eventList", Direction = SoapHeaderDirection.In)]
            public virtual void SetEvents()
            {
            }
    Vous avez surement remarqué le "SoapHeader("eventList", Direction = SoapHeaderDirection.In)" voici la classe d'où provient "eventList" (je simplifie car ca serait beaucoup trop long autrement....):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        /// <summary>
        /// Header SOAP d'accès à un paramètre du service web classe de base.
        /// Le Web service Plug expose une collection de paramètres.
        /// Le header SOAP PlugParam défini le mode d'accès au paramètre et son type.
        /// </summary>
        public class PlugParam : PlugField
        {
            /// <summary>
            /// Type d'accès au paramètre
            /// </summary>
            public enum Access
            {
                Read,
                Write,
                ReadWrite,
                CredentialRead,
                CredentialWrite,
                CredentialReadWrite
            }
            public string type;
            public Access access;
            public object value;
            public long time;
            public string sender; 
            public string recipient;
            public long operation;
            public PlugCallBack[] callsBack;
    Voici la question SOAP qui contient l'header customiser correspondant au SoapHeader("eventList", Direction = SoapHeaderDirection.In) vu précédement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Header>
        <PlugEventList xmlns="http://tempuri.org/">
          <events>
            <PlugParam>
              <type>string</type>
              <access>Read or Write or ReadWrite or CredentialRead or CredentialWrite or CredentialReadWrite</access>
              <value />
              <time>long</time>
              <sender>string</sender>
              <recipient>string</recipient>
              <operation>long</operation>
              <callsBack>
                <PlugCallBack xsi:nil="true" />
                <PlugCallBack xsi:nil="true" />
              </callsBack>
            </PlugParam>
            <PlugParam>
              <type>string</type>
              <access>Read or Write or ReadWrite or CredentialRead or CredentialWrite or CredentialReadWrite</access>
              <value />
              <time>long</time>
              <sender>string</sender>
              <recipient>string</recipient>
              <operation>long</operation>
              <callsBack>
                <PlugCallBack xsi:nil="true" />
                <PlugCallBack xsi:nil="true" />
              </callsBack>
            </PlugParam>
          </events>
        </PlugEventList>
      </soap12:Header>
      <soap12:Body>
        <SetEvents xmlns="http://tempuri.org/" />
      </soap12:Body>
    </soap12:Envelope>

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Par défaut
    Voila j'ai trouvé la moité de la solution: j'arrive à modifier les Header SOAP lors de l'appel (question) d'un web service, mais je cherche toujours comment les modifier lors de la réponse, est ce que quelqu'un as une idée ???

    Pour ceux que ca intéresse, voici le code pour modifier les Header SOAP lors de l'appel (question) d'un web service (ce code peut être mit directement dans le ***stub.java si le code a été généré via WSDL2JAVA). Bien entendu, il faut remplacer les "string,long ..." par les valeurs ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
        public static void GetDateTime(){
            long ticks = 0;
            try {
                String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
                Service  service = new Service();
                Call     call    = (Call) service.createCall();
                call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
                call.setOperationName("GetEvents");
                call.addParameter("GetEvents",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
                call.setReturnType( org.apache.axis.encoding.XMLType.XSD_LONG );
     
                SOAPHeaderElement PlugParam = new SOAPHeaderElement(new javax.xml.namespace.QName("PlugParam"));
                //PlugParam.setNamespaceURI("http://tempuri.org/");
     
                PlugParam.addChildElement("type").addTextNode("string");
                PlugParam.addChildElement("access").addTextNode("CredentialReadWrite");
                PlugParam.addChildElement("value").addTextNode("22");
                PlugParam.addChildElement("time").addTextNode("long");
                PlugParam.addChildElement("sender").addTextNode("string");
                PlugParam.addChildElement("recipient").addTextNode("string");
                PlugParam.addChildElement("operation").addTextNode("long");
     
                SOAPElement CallBack = PlugParam.addChildElement("callsBack");
                SOAPElement PlugCallBack = CallBack.addChildElement("PlugCallBack");
                PlugCallBack.addChildElement("url").addTextNode("string");
                PlugCallBack.addChildElement("name").addTextNode("string");
                PlugCallBack.addChildElement("time").addTextNode("long");
     
                SOAPElement aList = PlugCallBack.addChildElement("aList");
                aList.addChildElement("PlugField").addAttribute(new SOAPEnvelope().createName("xsi:nil"),"true");
                aList.addChildElement("PlugField").addAttribute(new SOAPEnvelope().createName("xsi:nil"),"true");
     
                CallBack.addChildElement(PlugCallBack);
     
                call.addHeader(PlugParam);
                Long ret = (Long) call.invoke(new java.lang.Object[] {new java.lang.Long(ticks)});
     
                System.out.println("Resultat : " + ret);
            } catch (Exception e) {
                System.err.println(e.toString());
                e.printStackTrace();
            }
        }
    Je vraiment, donc si quelqu'un à une idée, je serais très reconnaissant

  3. #3
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    le mieux serait sans doute d'utiliser la classe javax.xml.rpc.handler.GenericHandler qui te propose les méthodes handleRequest() et handleResponse().

    Cette classe te permet d'intercepter les requetes et réponses d'un ou de plusieurs WS.

    L'association d'un handler avec un WS se fait de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          Map config = new HashMap();
          config.put(...); // optionnel
     
          org.apache.axis.client.Service myService = ....
          QName port = new QName(namespaceURI, portName);
          List list = myService.getHandlerRegistry().getHandlerChain(port);
          list.add(new HandlerInfo(MyGenericHandler.class, config, null));

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Par défaut
    Merci d'avoir répondu, je me sent un peu moins seul!!!

    J'avais déjà entrapercue les handler, le problème est que je dois envoyer/recevoir des informations différentes et non connus à l'avance en fonction de l'exécution du programme et non des paramètres constants. Est ce que l'on peut faire ca avec cette classe si elle "intercepe" les messages?

  5. #5
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    ca depend de quoi dependent ces informations...

    il faudrait peut-etre essayer de faire en sorte que le handler puisse les déterminer lui-meme au moment ou il intercepte les messages, ou les passer via le MessageContext

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Salut !
    Effectivement le MessageContext te permet d'échanger des données entre ta couche métier et les handlers de ton WS. Tu peut donc très bien faire des modifications des header de messages SOAP avec des informations dynamiques variant en fonction de la requete.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter des header soap dans une WSDL
    Par ThomasParis dans le forum Services Web
    Réponses: 0
    Dernier message: 02/08/2010, 16h14
  2. [Web Service] PHP5 SOAP => Modification et formatage des headers SOAP
    Par ssc37 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 07/01/2010, 17h01
  3. [Débutant] Envoyer des header
    Par joseph_p dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 20/09/2005, 16h42
  4. [IDE] Gestion automatique des headers d'unités
    Par Clorish dans le forum Outils
    Réponses: 1
    Dernier message: 27/06/2005, 18h52
  5. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo