Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
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 07/12/2007, 17h49   #1
Membre du Club
 
Inscription : mai 2006
Messages : 210
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 210
Points : 67
Points : 67
Par défaut [SOAP] requête cliente mal formatée

Bonjour,

quand je fais :
Code :
1
2
3
4
5
6
7
 
$options = Array('trace' => 1);
$client = new SoapClient($wsdl,$options);
 
$dispos = $client->getDispos(new SoapParam('4513', "hotelId"),
new SoapParam($__debut, "dateDebutDDMMYYYY"),
new SoapParam($__fin, "dateFinDDMMYYYY"));
j'ai la request suivante :
Code :
1
2
3
4
5
6
7
8
 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://services.hotelbb.com/"><SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns1:getDispos/>
<dateDebutDDMMYYYY>10122007</dateDebutDDMMYYYY>
<dateFinDDMMYYYY>11122007</dateFinDDMMYYYY>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
1) comme vous le voyez, j'ai "<ns1:getDispos/>" et donc les parametres (dateDebutDDMMYYYY,dateFinDDMMYYYY)ne sont pas inclus dans le noeud getDispos

2) il manque le parametre "hotelId"

Merci pour votre aide.
mickael.guilbert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h27   #2
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Utilises-tu un fichier WSDL ?
Si c'est le cas ce n'est pas la peine d'utiliser SoapParam, et c'est lui qui te permet de formater tes messages.
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 10h37   #3
Membre du Club
 
Inscription : mai 2006
Messages : 210
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 210
Points : 67
Points : 67
OUI , j'utilise une wsdl.
j'utilise SoapParam pour pouvoir nommer mes parametres, car sinon, il me met : param1,param2,param au lieux de :
Code :
1
2
3
4
5
6
7
<xs:complexType name="getDispos">
- <xs:sequence>
  <xs:element name="hotelId" type="xs:string" minOccurs="0" /> 
  <xs:element name="dateDebutDDMMYYYY" type="xs:string" minOccurs="0" /> 
  <xs:element name="dateFinDDMMYYYY" type="xs:string" minOccurs="0" /> 
  </xs:sequence>
  </xs:complexType>
De plus ca ne change rien il envoi quand meme
Code :
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://services.hotelbb.com/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns1:getDispos/><param1>10/11/2007</param1><param2>11/11/2007</param2></SOAP-ENV:Body></SOAP-ENV:Envelope>
donc toujours le probleme du "<ns1:getDispos/>" et du premier parametre pas pris en compte.

pour info , mon wsdl fait reference à un xsd qui contient la definition des parametres.

le wsdl:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<types>
- <xsd:schema>
  <xsd:import namespace="http://services.xxx.com/" schemaLocation="http://yyyy:8080/xxxServices-war/HotelService?xsd=1" /> 
  </xsd:schema>
  </types>
 
<portType name="HotelService">
- <operation name="getDispos">
  <input message="tns:getDispos" /> 
  <output message="tns:getDisposResponse" /> 
  <fault message="tns:MetierException" name="MetierException" /> 
  </operation>
  </portType>
xsd contient :
Code :
1
2
3
4
5
6
7
<xs:complexType name="getDispos">
- <xs:sequence>
  <xs:element name="hotelId" type="xs:string" minOccurs="0" /> 
  <xs:element name="dateDebutDDMMYYYY" type="xs:string" minOccurs="0" /> 
  <xs:element name="dateFinDDMMYYYY" type="xs:string" minOccurs="0" /> 
  </xs:sequence>
  </xs:complexType>
mickael.guilbert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2007, 14h05   #4
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Moi je faisais autrement, mais je ne sais pas ce qu'il y a de mieux.
Par exemple pour ton cas j'aurais fait :

Code php :
1
2
3
4
5
6
$options = Array('trace' => 1);
$client = new SoapClient($wsdl,$options);
 
$params = array ('hotelId' => 4513, 'dateDebutDDMMYYYY' => 10122007, 'dateFinDDMMYYYY' => 11122007);
 
$resultat = $client-> __soapCall('getDispos', array ($params));

Ca fait un moment que j'ai pas touché a mon WebService, mais j'ai toujours fait comme ca. Je ne dis pas que c'est la bonne méthode mais ca fonctionne
Si ca te sort la meme chose, c'est dans ton WSDL qu'il y a un problème.
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 10h36   #5
Membre du Club
 
Inscription : mai 2006
Messages : 210
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 210
Points : 67
Points : 67
Effectivement, j'avais testé cette solution, le probleme c'est que ca me retourne un tableau associatif et non une liste d'objets

description de la reponse :
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
<xs:complexType name="getDisposResponse">
- <xs:sequence>
  <xs:element name="return" type="tns:dispo" minOccurs="0" maxOccurs="unbounded" /> 
  </xs:sequence>
  </xs:complexType>
- <xs:complexType name="dispo">
- <xs:sequence>
  <xs:element name="dateDebut" type="xs:dateTime" minOccurs="0" /> 
  <xs:element name="dateFin" type="xs:dateTime" minOccurs="0" /> 
  <xs:element name="nbDispo" type="xs:string" minOccurs="0" /> 
  <xs:element name="nbJours" type="xs:string" minOccurs="0" /> 
  <xs:element name="prestation" type="tns:prestation" minOccurs="0" /> 
  <xs:element name="tarifMax" type="tns:tarif" minOccurs="0" /> 
  <xs:element name="tarifMin" type="tns:tarif" minOccurs="0" /> 
  <xs:element name="tarifPeriode" type="tns:tarif" nillable="true" minOccurs="0" maxOccurs="unbounded" /> 
  </xs:sequence>
  </xs:complexType>
- <xs:complexType name="prestation">
- <xs:sequence>
  <xs:element name="code" type="xs:string" minOccurs="0" /> 
  <xs:element name="codeFamille" type="xs:string" minOccurs="0" /> 
  <xs:element name="libelle" type="xs:string" minOccurs="0" /> 
  </xs:sequence>
  </xs:complexType>
- <xs:complexType name="tarif">
- <xs:sequence>
  <xs:element name="codeDevise" type="xs:string" minOccurs="0" /> 
  <xs:element name="montant" type="xs:long" /> 
  </xs:sequence>
  </xs:complexType>
et j'obtiens :
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
stdClass Object
(
    [return] => Array
        (
            [0] => stdClass Object
                (
                    [dateDebut] => 2007-12-10T00:00:00+01:00
                    [dateFin] => 2007-12-11T00:00:00+01:00
                    [nbDispo] => 99999
                    [nbJours] => 1
                    [prestation] => stdClass Object
                        (
                            [cod] => C1        
                            [codeFamille] => 1
                            [libelle] => Chambre 1 grand lit           
                        )
 
                    [tarifMax] => stdClass Object
                        (
                            [codeDevise] => eur
                            [montant] => 42
                        )
 
                    [tarifMin] => stdClass Object
                        (
                            [codeDevise] => eur
                            [montant] => 42
                        )
 
                    [tarifPeriode] => stdClass Object
                        (
                            [codeDevise] => eur
                            [montant] => 42
                        )
 
                )
Si vous savez comment transformer ce tableau associatif en liste d'objets DISPO, je prends la solution tout de suite.
mickael.guilbert est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h18   #6
Membre éclairé
 
Homme
Développeur Web
Inscription : avril 2004
Messages : 319
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2004
Messages : 319
Points : 325
Points : 325
Tu peux essayer de mapper des classes PHP sur ces complexType.
Dans ce post koopajah l'explique bien :
http://www.developpez.net/forums/sho...light=classmap
Citation:
Le classmap sert a faire un mapping entre les types de ton WSDL et tes classes PHP pour stocker le résultat
J'avais testé cela, mais comme j'arrivais tout de même à traiter mes messages de retour avec ces stdClass Object, j'avais renoncer.

Je sais pas si c'est vraiment ce que tu veux par obtenir une "liste d'objets". Mais ce que tu obtiens actuellement tu peux quand même le traiter non ?
En tout cas au niveau WSDL tu peux pas faire mieux, après ca vient du traitement en php.
Guybrush113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 15h03   #7
Membre du Club
 
Inscription : mai 2006
Messages : 210
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 210
Points : 67
Points : 67
Ma solution :
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
 
$classmap = array();
$tmpClient = new SoapClient($wsdl);
 
foreach($tmpClient->__getTypes() as $type)
{
    $array = split(" ", $type);
    if($array[0] == "struct" && class_exists($array[1]))
    {
        $classmap[$array[1]] = $array[1];
    }
}
unset($tmpClient);
 
 
 
$options = Array('trace' => 1,'classmap' => $classmap);
$client = new SoapClient($wsdl,$options);
 
$param = array(array(
  "hotelId" => '4513',
  "dateDebutDDMMYYYY"  => $__debut,
  "dateFinDDMMYYYY" => $__fin
  ));
 
$response = $client->__soapCall("getDispos", $param);
 
foreach ($response->return as $dispo){
         echo "<td>" . $dispo->prestation->code . "</td>"; .........
}
classmap m'a permis de recuperer
Code :
stdClass Object ( [return] => Array ( [0] => Dispo Object ( [prestation] => Prestation Object ( [cod] => C1 [libelle] => Chambre 1 grand lit [codeFamille] => 1 [nbMaxOccupants] => ) [nbDispo] => 0 [tarifPeriode] => Tarif Object ( [montant] => 42 [devise] => [codeDevise] => eur ) [tarifMin] => Tarif Object ( [montant] => 42 [devise] => [codeDevise] => eur ) [tarifMax] => Tarif Object ( [montant] => 42 [devise] => [codeDevise] => eur ) [dateDebut] => 2007-12-12T00:00:00+01:00 [dateFin] => 2007-12-13T00:00:00+01:00 [nbJours] => 1 )
Merci
mickael.guilbert 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 16h36.


 
 
 
 
Partenaires

Hébergement Web