Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2011, 09h53   #1
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 68
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 68
Points : 26
Points : 26
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 :
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 :
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 :
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 :
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.
A&N_L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h32   #2
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 68
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 68
Points : 26
Points : 26
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 ?
A&N_L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 15h19   #3
Invité régulier
 
Inscription : juillet 2010
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 26
Points : 9
Points : 9
bon déja peu importe tes namespaces du moment que tu les déclare et tu les uses:

Code :
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 :
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 )
wasper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 16h47   #4
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 68
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 68
Points : 26
Points : 26
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.
A&N_L est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h06.


 
 
 
 
Partenaires

Hébergement Web