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

Flex Discussion :

Traitement retour Web Services SOAP [Flex4]


Sujet :

Flex

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Traitement retour Web Services SOAP
    Bonjour à tous,

    Je continue mon apprentissage de Flex 4.

    Là, je cale sur le traitement des retours des Web Services SOAP.

    Soit le Web Service SOAP suivant :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns2:getSortedAllCompanyEmployeesByNameResponse xmlns:ns2="http://usc.webservice.fr.java.main/">
                <uscEmployeeListSoap>
                    <uscEmployeeMapping>
                        <birthdate>25/04/1979</birthdate>
                        <department>
                            <code>DivT</code>
                            <description/>
                            <id>2</id>
                            <name>Division technique</name>
                        </department>
                        <function>
                            <code>SUPP1</code>
                            <description/>
                            <id>13</id>
                            <name>Ingénieur Support Client I</name>
                        </function>
                        <id>37</id>
                        <user>
                            <active>true</active>
                            <connectionDate>16/07/2010</connectionDate>
                            <email>Steeve.Achard@Company.fr</email>
                            <firstname>Steeve</firstname>
                            <gender>M</gender>
                            <login>SUPP1</login>
                            <name>ACHARD</name>
                            <role>Employee</role>
                        </user>
                    </uscEmployeeMapping>
                    ...
    Le code Flex 4 suivant :
    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
    <?xml version="1.0" encoding="utf-8"?>
    <s:Group  xmlns:fx="http://ns.adobe.com/mxml/2009" 
    		  xmlns:s="library://ns.adobe.com/flex/spark" 
    		  xmlns:mx="library://ns.adobe.com/flex/mx"
    		  xmlns:uscwsgetemployee="services.uscwsgetemployee.*">	
     
            <fx:Script>
    		<![CDATA[
    			import mx.controls.Alert;
    			import mx.events.FlexEvent;
    			import mx.rpc.events.ResultEvent;
     
    			protected function EmployeesDirectory_creationCompleteHandler(event:FlexEvent):void
    			{
    				getSortedAllCompanyEmployeesByNameResult.token = uscWsGetEmployee.getSortedAllCompanyEmployeesByName();
    			}
    		]]>
    	</fx:Script>
     
    	<fx:Declarations>
    		<s:CallResponder id="getSortedAllCompanyEmployeesByNameResult"/>
    		<uscwsgetemployee:UscWsGetEmployee id="uscWsGetEmployee" fault="Alert.show(event.fault.faultString + 'n' + event.fault.faultDetail)" showBusyCursor="true"/>
    		<!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). -->
    	</fx:Declarations>	
     
    	<mx:AdvancedDataGrid id="EmployeesList" designViewDataType="flat" creationComplete="EmployeesDirectory_creationCompleteHandler(event)" dataProvider="{getSortedAllCompanyEmployeesByNameResult.lastResult}">
    		<mx:columns>
    			<mx:AdvancedDataGridColumn headerText="Civilité" dataField="user.gender"/>
    			<mx:AdvancedDataGridColumn headerText="Nom" dataField="user.name"/>
    			<mx:AdvancedDataGridColumn headerText="Prénom" dataField="user.firstname"/>
    			<mx:AdvancedDataGridColumn headerText="Date de naissance" dataField="birthdate"/>
    			<mx:AdvancedDataGridColumn headerText="Fonction" dataField="_function.code"/>
    			<mx:AdvancedDataGridColumn headerText="Actif" dataField="user.active"/>
    		</mx:columns>
    	</mx:AdvancedDataGrid>	
     
    </s:Group>
    Là où le bas blesse donc, c'est que je n'ai qu'une information qui est affichée, la date de naissance, toutes les autres colonnes/propriétés sont vides.

    Pourtant, lors de l'introspection de mon Web Service faite par Flash Builder, il m'a bien été généré(e ?) une classe Employee avec comme attribut un User (et donc la classe User correspondante).

    Testé avec ce deuxième bout de 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?xml version="1.0" encoding="utf-8"?>
    <s:Group  xmlns:fx="http://ns.adobe.com/mxml/2009" 
    		  xmlns:s="library://ns.adobe.com/flex/spark" 
    		  xmlns:mx="library://ns.adobe.com/flex/mx"
                      xmlns:uscwsgetemployee="services.uscwsgetemployee.*">	
     
    	<fx:Script>
    		<![CDATA[
    			import mx.collections.ArrayCollection;
    			import mx.controls.Alert;
    			import mx.events.FlexEvent;
    			import mx.rpc.events.ResultEvent;
    			import mx.utils.ObjectUtil;
     
    			protected function uscWsGetEmployee_resultHandler(event:ResultEvent):void
    			{
    				var result:ArrayCollection=getSortedAllCompanyEmployeesByNameResult.lastResult as ArrayCollection;
     
    				var cpt1:int;
    				var cpt2:int;
     
    				for (cpt1; cpt1<result.length; cpt1++) {
    					trace(ObjectUtil.toString(result.getItemAt(cpt1)));
    				}
     
    				for (cpt2; cpt2<result.length; cpt2++) {
    					trace(result.getItemAt(cpt2).name);
    				}
    			}
     
    			protected function button1_clickHandler(event:MouseEvent):void
    			{					
    				getSortedAllCompanyEmployeesByNameResult.token = uscWsGetEmployee.getSortedAllCompanyEmployeesByName();
    			}
     
    		]]>
    	</fx:Script>
     
    	<fx:Declarations>
    		<s:CallResponder id="getSortedAllCompanyEmployeesByNameResult"/>
    		<uscwsgetemployee:UscWsGetEmployee id="uscWsGetEmployee" fault="Alert.show(event.fault.faultString + 'n' + event.fault.faultDetail)" result="uscWsGetEmployee_resultHandler(event)" showBusyCursor="true"/>
    		<!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). -->
    	</fx:Declarations>	
     
    	<s:Button label="Invoquer Web Service" click="button1_clickHandler(event)" y="170"/>
     
    </s:Group>
    Sur la première bouche for, Flash Tracer me renvoie bien une liste d'employés.

    Sur la deuxième boucle for, Flash Tracer me renvoie l'erreur suivante :
    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
    ReferenceError: Error #1069: La propriété name est introuvable sur services.uscwsgetemployee.valueObjects.Employee et il n'existe pas de valeur par défaut.
    at fr.comatek.views.employee::EmployeesDirectory/uscWsGetEmployee_resultHandler()[C:Devworkspaceu-ston-config-localflex_srcfrcomatekviewsemployeeEmployeesDirectory.mxml:28]
    at fr.comatek.views.employee::EmployeesDirectory/__uscWsGetEmployee_result()[C:Devworkspaceu-ston-config-localflex_srcfrcomatekviewsemployeeEmployeesDirectory.mxml:42]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at com.adobe.fiber.services.wrapper::AbstractServiceWrapper/http://www.adobe.com/2008/flex/model/internal::propagateEvents()[C:depotDataServicesbrancheslcds31_finalframeworksprojectsfiber-swcsrccomadobefiberserviceswrapperAbstractServiceWrapper.as:200]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.rpc::AbstractService/dispatchEvent()[E:dev4.xframeworksprojectsrpcsrcmxrpcAbstractService.as:333]
    at mx.rpc.soap.mxml::WebService/dispatchEvent()[E:dev4.xframeworksprojectsrpcsrcmxrpcsoapmxmlWebService.as:267]
    at mx.rpc::AbstractOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:dev4.xframeworksprojectsrpcsrcmxrpcAbstractOperation.as:254]
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:dev4.xframeworksprojectsrpcsrcmxrpcAbstractInvoker.as:318]
    at mx.rpc::Responder/result()[E:dev4.xframeworksprojectsrpcsrcmxrpcResponder.as:56]
    at mx.rpc::AsyncRequest/acknowledge()[E:dev4.xframeworksprojectsrpcsrcmxrpcAsyncRequest.as:84]
    at DirectHTTPMessageResponder/completeHandler()[E:dev4.xframeworksprojectsrpcsrcmxmessagingchannelsDirectHTTPChannel.as:446]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.net::URLLoader/onComplete()
    Merci par avance pour vos divers éclairages/contributions.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Bonjour à tous,

    Si je me réfère à ce post, je m'interroge sur le fait que mon Web Service soit correctement construit.

    En effet, il y est fait mention de la notion de namespace qui, dans mon cas, n'apparaissent explicitement pas au niveau des différents noeuds de mon Web Service.

    Il me semble que des namespaces par défaut sont définit au travers du schéma XSD de mon WebService, y a-t-il un moyen/une méthode pour les récupérer depuis mon code Flex ?

    Ou bien dois-je modifier le Web Service pour tagger les différents noeuds de namespaces explicites ?

    Autre solution envisagée, utiliser le parsing XML à la sauce E4X ?

    Mais si je m'en réfère à ce post, depuis l'avènement de Flex 4 et des objets fortement typés grâce au mécanisme d'instropection de Flash Builder 4, le parsing XML n'aurait plus lieu d'être utilisé...?.

    Quelle solution privilégier selon vous ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    bon déja peu importe tes namespaces du moment que tu les déclare et tu les uses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // déclare namespace for use result SW
    	private namespace ns3 = "http://blabla1";
    	private namespace ns2 = "http://blabla2";
    	use namespace ns3;
    	use namespace ns2;
    après ça tu peux utiliser le result comme un xml E4X ( a mettre dans le format de retour de ton opération du SW) :

    ensuite tu peux faire dans le result:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected function WS_resultHandler(event:ResultEvent):void{
    	var result:XMLList = XMLList(event.result);
     
    	for each(var obj:Object in result."TON CHAMP RECHERCHER"){
    		tatest.text += "id :" + obj.CHAMPENFANT1 + "\n"  
    			+"Centre : " + obj.CHAMPENFANT2+ "\n"
    			+ "Local : " + obj.CHAMPENFANT6+ "\n"
     ........
    				}								
    			}
    ( basé sur mon code fonctionnel )

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Bonjour wasper,

    Merci pour ton éclairage.

    Je n'ai finalement pas utilisé les namespaces mais ai, comme tu me l'as si bien suggéré, employé le result comme un xml e4x, cela fonctionne donc parfaitement !

    Encore merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2012, 00h01
  2. [Flex4] CallResponder et traitement retour Web Service
    Par A&N_L dans le forum Flex
    Réponses: 7
    Dernier message: 11/04/2011, 16h31
  3. Déploiement web services SOAP sur Websphere 5.1
    Par g_rare dans le forum Websphere
    Réponses: 1
    Dernier message: 19/03/2007, 10h30
  4. web services, soap et compression.
    Par renaudjuif dans le forum Langage
    Réponses: 6
    Dernier message: 31/07/2006, 15h44
  5. [Web Service] [SOAP] Envoie requete
    Par _beber85 dans le forum JDBC
    Réponses: 1
    Dernier message: 08/06/2006, 09h31

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