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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    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 habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    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 habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Est ce que quelqu'un aurais un exemple simple d'utilisation des handler ou l'adresse d'un bon tutoriel car je n'ais pas trouvé grand chose moi non plus sur notre amis ?

    Merci d'avance!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    J'ai essayé d'utiliser la classe javax.xml.rpc.handler.GenericHandler, mais mon handler ne semble pas être utilisé, sans que je comprenne pourquoi, quelqu'un a une idée?. J'ai créer un petit système de log pour pouvoir voir quand certaine fonctions sont appelées...

    Voici mon wsdd (le package dans lequel se trouve le handler s'appel bien "nitro_linux_test" et le SOAPMonitor marche à l'inverse de mon handler...):
    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
      <service name="uddiSoap12" provider="java:RPC" style="wrapped" use="literal">
          <requestFlow>
            <handler type="soapmonitor"/>
    	<handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler" className="nitro_linux_test.Mon_Handler" />
          </requestFlow>
          <responseFlow>
            <handler type="soapmonitor"/>
    	<handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler" className="nitro_linux_test.Mon_Handler" />
          </responseFlow>
          <parameter name="wsdlTargetNamespace" value="http://tempuri.org/"/>
          <parameter name="wsdlServiceElement" value="uddi"/>
          <parameter name="schemaQualified" value="http://tempuri.org/"/>
          <parameter name="wsdlServicePort" value="uddiSoap12"/>
          <parameter name="className" value="org.tempuri.UddiSoap12Skeleton"/>
          <parameter name="wsdlPortType" value="uddiSoap"/>
          <parameter name="typeMappingVersion" value="1.2"/>
          <parameter name="allowedMethods" value="*"/>
     
          <typeMapping
            xmlns:ns="http://tempuri.org/"
            qname="ns:>GetDeviceResponse"
            type="java:org.tempuri.GetDeviceResponse"
            serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
            deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
            encodingStyle=""
          />
    Voici mon Handler :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    package nitro_linux_test;
     
    import java.util.Map;
    import javax.xml.rpc.handler.Handler;
    import javax.xml.rpc.handler.HandlerInfo;
    import javax.xml.rpc.handler.MessageContext;
    import javax.xml.rpc.handler.soap.SOAPMessageContext;
    import javax.xml.rpc.JAXRPCException;
    import javax.xml.namespace.QName;
     
    import nitro_linux_test.Log_Writter;
     
    public class Mon_Handler implements Handler{
        private HandlerInfo handlerInfo;
        private Log_Writter Log;
     
        public Mon_Handler() {
            super();
            Log = new Log_Writter("Handler");
            Log.ecrire("Construction"); //Fonction JAMAIS appelée
            System.out.println("Construction");
        }
     
        public void init(HandlerInfo hi) {
            handlerInfo = hi;
            Log.ecrire("Initialisation"); //Fonction JAMAIS appelée
            System.out.println("Initialisation");
        }
     
        public void destroy() {}
     
        public QName[] getHeaders() {
            return handlerInfo.getHeaders();
        }
     
        public boolean handleRequest(MessageContext mc) {
            SOAPMessageContext messageContext = (SOAPMessageContext) mc;
            Log.ecrire("** Request: "+messageContext.getMessage().toString()); //Fonction JAMAIS appelée
            System.out.println("** Request: "+messageContext.getMessage().toString());
            return true;
        }
     
        public boolean handleResponse(MessageContext mc) {
            SOAPMessageContext messageContext = (SOAPMessageContext) mc;
            Log.ecrire("** Response: "+messageContext.getMessage().toString()); //Fonction JAMAIS appelée
            System.out.println("** Response: "+messageContext.getMessage().toString());
            return true;
        }
     
        public boolean handleFault(MessageContext mc) {
            SOAPMessageContext messageContext = (SOAPMessageContext) mc;
            Log.ecrire("** Fault: "+messageContext.getMessage().toString()); //Fonction JAMAIS appelée
            System.out.println("** Fault: "+messageContext.getMessage().toString());
            return true;
        }
    }
    et enfin l'appel:
    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
    import nitro_linux_test.Mon_Handler;
    import nitro_linux_test.Log_Writter;
     
    public class Main {
        private static UddiSoap12Stub _UDDI;
        private static Log_Writter Log;
     
        public static void GetEvents(){
            long ticks = 0;
     
            try {            
                String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
                Service  service = new Service();
                QName port = new QName("GetEvents");
                List list = service.getHandlerRegistry().getHandlerChain(port);
                list.add(new HandlerInfo(Mon_Handler.class, null, null));
                service.getHandlerRegistry().setHandlerChain(port,list);
                System.out.println(port.toString());
                Log.ecrire(port.toString());  //Fonction correctement appelée
     
                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 );
     
                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();
            }
        }

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    ca doit venir d'une mauvaise intialisation de ton objet QName port.

    peux-tu postyer le fichier wsdl ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Je rappel que je suis en train de réaliser le portage d'une application Win/.Net vers Linux/Java. J'ai gardé le WSDL d'origine d'où la présence des ".asmx" dans ce dernier...

    Je présice également que j'arrive à deployer et appeller mes Web-Services mais que le handler mit en place ne semble pas être utilisé.

    Le Fichier WSDL est en pièce jointe...

    Merci de s'intéresser à mon problème !
    Fichiers attachés Fichiers attachés

  11. #11
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QName port = new QName("http://tempuri.org", "uddi")
    le premier parametre correspond à l'attribut targetNamespace du tag wsdl:definition, le second à l'attribut name du tag wsdl:service

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    A première vue ca ne marche pas MAIS j'ai un fonctionement anormal: lorsque j'utilise ma classe de Log dans une des fonctions (web-service) du Stub cela ne produit rien non plus, alors qu'elle marche dans le package principal.

    Pour éviter de perdre plus de temps je vais repartir à 0 avec un Web-Service ultra simple et re-essayé de mettre un handler.

    Je n'ais pas le temps de faire cela dans l'imédia, mais j'espère pouvoir ré-essayé dans quelques jours.

    En résumé: mille merci pour votre aide précieuse, je vais certainement vous solliciter de nouveau bientôt !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Bon voila j'ai ré-essayé avec un service plus simple, mais toujours sans succès.

    Le code se mon handler est le même que celui précédement posté, sauf qui est maintenant dans le package org.tempuri. La class de log a également été déplacé dans org.tempuri

    Voici mon Main:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    package service_simple;
     
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.List;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.handler.HandlerInfo;
    import javax.xml.rpc.handler.HandlerRegistry;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.AxisFault;
    import java.rmi.RemoteException;
    import org.tempuri.UddiSoap12Stub;
    import org.tempuri.Mon_Handler;
    import org.tempuri.Log_Writter;
     
     
    public class Main {
        private static UddiSoap12Stub _UDDI;
        private static Log_Writter Log=new Log_Writter("Main");
     
        public static void getDevice(){
            String ticks ="Test Get Device ?";
     
            try {            
                String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
                Service  service = new Service();
                QName port = new QName("http://tempuri.org/", "uddi");
                //QName port = new QName("http://tempuri.org/", "uddiSoap12");
                List list = service.getHandlerRegistry().getHandlerChain(port);
                list.add(new HandlerInfo(Mon_Handler.class, null, null));
                service.getHandlerRegistry().setHandlerChain(port,list);
                System.out.println(port.toString());
                //Log.ecrire(port.toString());
     
                Call call = (Call) service.createCall();
                call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
                call.setOperationName("getDevice");
                call.addParameter("getDevice",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
                call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
     
                String ret = (String) call.invoke(new java.lang.Object[] {new java.lang.String(ticks)});
     
                System.out.println("Resultat : " + ret);
            } catch (Exception e) {
                System.err.println(e.toString());
                e.printStackTrace();
            }
        }
     
        public static void main(String[] args) {
            getDevice();
        }
    }
    et mon wsdd:
    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
    <deployment
        xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     
      <!-- Services from uddi WSDL service -->
     
      <service name="uddiSoap12" provider="java:RPC" style="wrapped" use="literal">
          <requestFlow>
            <handler type="soapmonitor"/>
    	<handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler" className="org.tempuri.Mon_Handler" />
          </requestFlow>
          <responseFlow>
            <handler type="soapmonitor"/>
    	<handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler" className="org.tempuri.Mon_Handler" />
          </responseFlow>
          <parameter name="wsdlTargetNamespace" value="http://tempuri.org/"/>
          <parameter name="wsdlServiceElement" value="uddi"/>
          <parameter name="schemaQualified" value="http://tempuri.org/"/>
          <parameter name="wsdlServicePort" value="uddiSoap12"/>
          <parameter name="className" value="org.tempuri.UddiSoap12Skeleton"/>
          <parameter name="wsdlPortType" value="uddiSoap"/>
          <parameter name="typeMappingVersion" value="1.2"/>
          <parameter name="allowedMethods" value="*"/>
      </service>
    </deployment>
    Le wsdl:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
      <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
          <s:element name="GetDevice">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="deviceName" type="s:string"/>
              </s:sequence>
            </s:complexType>
          </s:element>
          <s:element name="GetDeviceResponse">
            <s:complexType>
              <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="GetDeviceResult" type="s:string"/>
              </s:sequence>
            </s:complexType>
          </s:element>
        </s:schema>
      </wsdl:types>
      <wsdl:message name="GetDeviceSoapIn">
        <wsdl:part name="parameters" element="tns:GetDevice"/>
      </wsdl:message>
      <wsdl:message name="GetDeviceSoapOut">
        <wsdl:part name="parameters" element="tns:GetDeviceResponse"/>
      </wsdl:message>
      <wsdl:portType name="uddiSoap">
        <wsdl:operation name="GetDevice">
          <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Element XML de description d'un device</wsdl:documentation>
          <wsdl:input message="tns:GetDeviceSoapIn"/>
          <wsdl:output message="tns:GetDeviceSoapOut"/>
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="uddiSoap12" type="tns:uddiSoap">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="GetDevice">
          <soap12:operation soapAction="http://tempuri.org/GetDevice" style="document"/>
          <wsdl:input>
            <soap12:body use="literal"/>
          </wsdl:input>
          <wsdl:output>
            <soap12:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="uddi">
        <wsdl:port name="uddiSoap12" binding="tns:uddiSoap12">
          <soap12:address location="http://localhost:8084/axis/services/uddiSoap12"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    Apparement pas de trace de mon handler dans le server-config.wsdd du server Tomcat, normal?:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     <globalConfiguration>
      <parameter name="sendMultiRefs" value="true"/>
      <parameter name="disablePrettyXML" value="true"/>
      <parameter name="adminPassword" value="admin"/>
      <parameter name="attachments.Directory" value="/home/ambroise/.netbeans/5.0/jakarta-tomcat-5.5.9_base/webapps/axis/WEB-INF/attachments"/>
      <parameter name="dotNetSoapEncFix" value="true"/>
      <parameter name="enableNamespacePrefixOptimization" value="false"/>
      <parameter name="sendXMLDeclaration" value="true"/>
      <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
      <parameter name="sendXsiTypes" value="true"/>
      <requestFlow>
       <handler type="java:org.apache.axis.handlers.JWSHandler">
        <parameter name="scope" value="session"/>
       </handler>
       <handler type="java:org.apache.axis.handlers.JWSHandler">
        <parameter name="scope" value="request"/>
        <parameter name="extension" value=".jwr"/>
       </handler>
      </requestFlow>
     </globalConfiguration>
     <handler name="soapmonitor" type="java:org.apache.axis.handlers.SOAPMonitorHandler">
      <parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
      <parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
      <parameter name="serviceName" value="SOAPMonitorService"/>
      <parameter name="portName" value="Demo"/>
     </handler>
     <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
     <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
     <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
     <handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler"/>
     <service name="AdminService" provider="java:MSG">
      <parameter name="allowedMethods" value="AdminService"/>
      <parameter name="enableRemoteAdmin" value="false"/>
      <parameter name="className" value="org.apache.axis.utils.Admin"/>
      <namespace>http://xml.apache.org/axis/wsdd/</namespace>
      <namespace>http://xml.apache.org/axis/wsdd/</namespace>
     </service>
     <service name="uddiSoap12" provider="java:RPC" style="wrapped" use="literal">
      <requestFlow>
       <handler type="soapmonitor"/>
       <handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler"/>
      </requestFlow>
      <responseFlow>
       <handler type="soapmonitor"/>
       <handler name="Mon_Handler" type="java:org.apache.axis.handlers.JAXRPCHandler"/>
      </responseFlow>
      <parameter name="allowedMethods" value="*"/>
      <parameter name="typeMappingVersion" value="1.2"/>
      <parameter name="wsdlPortType" value="uddiSoap"/>
      <parameter name="className" value="org.tempuri.UddiSoap12Skeleton"/>
      <parameter name="wsdlServicePort" value="uddiSoap12"/>
      <parameter name="schemaQualified" value="http://tempuri.org/"/>
      <parameter name="wsdlTargetNamespace" value="http://tempuri.org/"/>
      <parameter name="wsdlServiceElement" value="uddi"/>
     </service>
     <service name="Version" provider="java:RPC">
      <parameter name="allowedMethods" value="getVersion"/>
      <parameter name="className" value="org.apache.axis.Version"/>
     </service>
     <service name="SOAPMonitorService" provider="java:RPC">
      <parameter name="allowedMethods" value="publishMessage"/>
      <parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/>
      <parameter name="scope" value="Application"/>
     </service>
     <transport name="http">
      <requestFlow>
       <handler type="URLMapper"/>
       <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
      </requestFlow>
      <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
      <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
      <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
      <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
      <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
      <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
     </transport>
     <transport name="local">
      <responseFlow>
       <handler type="LocalResponder"/>
      </responseFlow>
     </transport>
    </deployment>
    Je ne comprend toujours pas pourquoi mon handler ne marche pas:
    si quelqu'un à le courage de regarder mon code ou de me donner un exemple simple ca serais très sympa !!!
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  14. #14
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    [edit] je viens de tester, et ca ne marche pas...

    le probleme vient peut etre du fait qu'on essaye d'associer le handler a ton service. En effet, ton objet service n'est pas "qualifié". Dans ton cas tu utilises le service uniquement pour créer un call et spécifier ce call par la suite.

    la solution serait peut etre un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
     
    QName port = call.getOperationName();
    List list = service.getHandlerRegistry().getHandlerChain(port);
    list.add(new HandlerInfo(Mon_Handler.class, null, null));

  15. #15
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    Ca y est ! j'ai trouvé la faille.

    il faut spécifier le portName de ton objet Call.
    Sous réserve que les noms des différents QNames soient corrects, ca devrait passer

    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
    String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
    Service service = new Service(endpointURL, new QName("http://tempuri.org/", "uddi"));
    
    QName port = service.getServiceName();
    List list = service.getHandlerRegistry().getHandlerChain(port);
    list.add(new HandlerInfo(Mon_Handler.class, null, null));
    service.getHandlerRegistry().setHandlerChain(port,list);
    System.out.println(port.toString());
                
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
    call.setPortName(new QName("http://tempuri.org/", "uddiSoap"));
    call.setOperationName("getDevice");
    call.addParameter("getDevice",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
    call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
    
    String ret = (String) call.invoke(new java.lang.Object[] {new java.lang.String(ticks)});

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut


    Bravo et merci : vous avez trouvez !!!!
    Je poste quand même la micro-modif que j'ai du faire pour ceux qui voudrais reprendre mon code...

    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
    public static void getDevice(){
            String ticks ="Parametre GetDevice";
            
            try {
                String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
                Service service = new Service(endpointURL, new QName("http://tempuri.org/", "uddi"));
                
                QName port = service.getServiceName();
                List list = service.getHandlerRegistry().getHandlerChain(port);
                list.add(new HandlerInfo(Mon_Handler.class, null, null));
                service.getHandlerRegistry().setHandlerChain(port,list);
                
                System.out.println(port.toString());
                System.out.println(service.getHandlerRegistry().getHandlerChain(port));
    
                Call call = (Call) service.createCall();
                call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
                //call.setPortName(new QName("http://tempuri.org/", "uddiSoap"));
                call.setPortName(new QName("http://tempuri.org/", "uddi"));
                call.setOperationName("getDevice");
                call.addParameter("getDevice",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
                call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
                
                System.out.println(call.getPortName());
                
                String ret = (String) call.invoke(new java.lang.Object[] {new java.lang.String(ticks)});
                
                System.out.println("Resultat : " + ret);
            } catch (Exception e) {
                System.err.println(e.toString());
                e.printStackTrace();
            }
        }
    La prochaine étapes va consister à modifier les Headers SOAP (ca devrait être plus facile maintenant ) et intégré le tout dans le code généré par WSDL2Java ... J'en profite pour réitérer ma demande : si quelqu'un connais un bon site/tutoriel qui traite des MessageContext et des SOAPHeader je suis preneur.

    Encore une fois :


  17. #17
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    sur le wsdl que j'ai utilisé pour faire des tests, tous les elements avaient le meme nom (service, port, etc...).
    de plus, la javadoc n'est pas tres claire concernant la methode getHandlerChain(QName) : le parametre s'appelle "port" et la description indique que le parametre represente le service name....

    et j'ai fait une confusion entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QName port = service.getServiceName();
    List list = service.getHandlerRegistry().getHandlerChain(port);
    list.add(new HandlerInfo(WebServicesHandler.class, config, null));
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (Iterator iter = service.getPorts(); iter.hasNext();) {
       QName port = (QName) iter.next();
       List list = service.getHandlerRegistry().getHandlerChain(port);
       list.add(new HandlerInfo(WebServicesHandler.class, config, null));
    }
    (ce qui d'ailleurs, a posteriori, semble plus logique)


    pour en etre sur, peut etre devrais tu faire un petit test dans ce gout la :
    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
    String endpointURL = "http://localhost:8084/axis/services/uddiSoap12?wsdl";
    Service service = new Service(endpointURL, new QName("http://tempuri.org/", "uddi"));
    
    for (Iterator iter = service.getPorts(); iter.hasNext();) {
       QName port = (QName) iter.next();
       List list = service.getHandlerRegistry().getHandlerChain(port);
       list.add(new HandlerInfo(WebServicesHandler.class, config, null));
    }
    System.out.println(port.toString());
                
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
    call.setPortName(new QName("http://tempuri.org/", "uddiSoap12"));
    call.setOperationName("getDevice");
    call.addParameter("getDevice",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
    call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
    
    String ret = (String) call.invoke(new java.lang.Object[] {new java.lang.String(ticks)});

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    La version d'origine marche, apparement pas celle avec la boucle, donc naturellement je pense que je vais garder la première.


    J'arrive à utiliser un propre Handler et à modifier les Headers SOAP dans l' "handleRequest". Jusqu'à maintenant, je réalisé un appel de web service "à la main".

    L'objectif de cette manipulation est d'arrivé à modifier les Hearders SOAP dans du code générer avec l'utilitaire WSDL2Java à partir du WSDL.

    Je n'est pas encore vraiment approfondi la question, mais je pense qu'il faut configurer le handler dans les méthodes qui gère les "Call" dans le fichier "***stub.java" est ce que c'est bien ça?

    Le handler permet apparement de modifier les message SOAP d'une "Request" et d'analyser les message SOAP d'une "Response". L'autre question que je me pose c'est comment configuré les messages SOAP lors du "Response" (côté serveur) à une "Request" (côté client), fichier "***skeleton.java"??? .

    Merci d'avance. Je continu à rechercher de m'on côté et je vous donnes la solution si je la trouve d'ici la, comme d'hab....

  19. #19
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    Evite de modifier les fichiers generes par WSDL2Java : le jour ou tu les regeneres pour une raison x ou y, tu perds tes modifs...

    je bosse avec des fichiers générés par WSDL2Java, et je gere les handlers de cette facon :

    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
    ***_ServiceLocator service = new ***_ServiceLocator();
    service.set***EndPointAddress("http://..."); //optionnel car déjà positionné par défaut, normalement
     
    Map config = new HashMap();
    config.put(...);
     
    try {
       for (Iterator iter = serviceLocator.getPorts(); iter.hasNext();) {
          QName port = (QName) iter.next();
          List list = serviceLocator.getHandlerRegistry().getHandlerChain(port);
          list.add(new HandlerInfo(WebServicesHandler.class, config, null));
       }
    }
    catch (ServiceException e) {
    ...
    }

    pour analyser la response, ca se fait "tout seul" avec le handleResponse du Handler associé a la request

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    J'ai essayé d'appliquer ce que vous m'aviez sugéré dans le précédent post avec la méthode "getDeviceOK()" (l'autre correspond à la méthode "manuel" qui marche) sans succès: le handler n'est pas appelé !

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class Init_Handlers {
        private static UddiLocator _UDDI_Loc;
        private static UddiSoap12Stub _UDDI_Stub;
        private static String endpointURL ="http://localhost:8084/axis/services/uddiSoap12?wsdl";
        
        public static void getDeviceOK() throws ServiceException, RemoteException, MalformedURLException{
            _UDDI_Loc = new UddiLocator();
            //_UDDI_Loc = new UddiLocator(endpointURL, new QName("http://tempuri.org/", "uddi"));
            
            Map config = new HashMap();
            config.put("Test","valeur");
    
            for (Iterator iter = _UDDI_Loc.getPorts(); iter.hasNext();) {
                QName port = (QName) iter.next();
                List list = _UDDI_Loc.getHandlerRegistry().getHandlerChain(port);
                //list.add(new HandlerInfo(Mon_Handler.class, config, null));
                list.add(new HandlerInfo(Mon_Handler.class, config, null));
                System.out.println(port.toString());
            } // => {http://tempuri.org/}uddiSoap12 / Resultat : resultat getDevice
            
            /*
                QName port = _UDDI_Loc.getServiceName();
                List list = _UDDI_Loc.getHandlerRegistry().getHandlerChain(port);
                list.add(new HandlerInfo(Mon_Handler.class, null, null));
                _UDDI_Loc.getHandlerRegistry().setHandlerChain(port,list);
                System.out.println(port.toString());
                // => {http://tempuri.org/}uddi / Resultat : resultat getDevice 
            */
    
            _UDDI_Stub = new UddiSoap12Stub(new URL(endpointURL), _UDDI_Loc);
              //_UDDI_Stub = new UddiSoap12Stub(_UDDI_Loc); //Marche pas ... 
            System.out.println("Resultat : " +_UDDI_Stub.getDevice("MethodeOk"));
        }
        
        public static void getDevice(){
            try {
                Service service = new Service(endpointURL, new QName("http://tempuri.org/", "uddi"));
                
                QName port = service.getServiceName();
                List list = service.getHandlerRegistry().getHandlerChain(port);
                list.add(new HandlerInfo(Mon_Handler.class, null, null));
                service.getHandlerRegistry().setHandlerChain(port,list);
    
                Call call = (Call) service.createCall();
                call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
                call.setPortName(new QName("http://tempuri.org/", "uddi"));
                call.setOperationName("getDevice");
                call.addParameter("getDevice",org.apache.axis.encoding.XMLType.XSD_LONG,javax.xml.rpc.ParameterMode.IN);
                call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );
                
                System.out.println(call.getPortName());
                String ret = (String) call.invoke(new java.lang.Object[] {new java.lang.String("MethodeManuel")});
                System.out.println("Resultat : " + ret);
            } catch (Exception e) {
                System.err.println(e.toString());
                e.printStackTrace();
            }
        }
    }

    Citation Envoyé par Le résultat
    {http://tempuri.org/}uddiSoap12
    Resultat : resultat getDevice
    -----------------------
    {http://tempuri.org/}uddi
    Construction<- le Handler est appellé
    Initialisation<- le Handler est appellé
    ** Request: org.apache.axis.Message@8de462 <- le Handler est appellé
    ** Response: org.apache.axis.Message@18ce14a <- le Handler est appellé
    Resultat : resultat getDevice
    Je suis en peu surpris par le fait que le port géré automatiquement n'est pas le même que celui réalisé manuellement....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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