Php 5.2.3 et soap

cloc83 Messages postés 4 Date d'inscription lundi 16 avril 2007 Statut Membre Dernière intervention 3 décembre 2007 - 4 juil. 2007 à 15:01
cloc83 Messages postés 4 Date d'inscription lundi 16 avril 2007 Statut Membre Dernière intervention 3 décembre 2007 - 3 déc. 2007 à 09:21
Bonjour à tous,

je développe un service web utilisant soap et un fichier wsdl. Le
premier développement a lieu sur WAMP. Le résultat est conforme à mes
attentes. Puis j'ai déplacé mon service sur une plateforme de test sur
debian avec php 5.2.3. Les résultats sont les mêmes. J'ai donc déplacé
le service sur le serveur de production. Surprise ! L'enveloppe SOAP
est modifiée : un espace de nommage a été rajouté :
"xmlns:ns2="http://xml.apache.org/xml-soap" et la syntaxe de retour
n'est pas la même qu'auparavant. Mon client ne récupère pas la même
structure... En plus, l'espace de nommage ajouté ne correspond plus à une page existante

Ayant eu une longue discussion avec l'hébergeur, nous ne sommes pas arrivés à localiser d'où venait précisément le problème.

Il est certain que c'est bien PHP qui renvoie une structure modifiée
mais je n'arrive pas à savoir quel élément n'est pas à jour.

en prod : PHP Version 5.2.3-0.dotdeb.0 build du Jun 4 2007 10:57:08

en test : PHP Version 5.2.3-0.dotdeb.1 build du Jun 1 2007 15:09:44

Je ne sais pas de quel côté chercher.

Une idée ?

6 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
6 juil. 2007 à 10:15
Hello,

je bosse régulièrement avec SOAP et je n'ai jamais eu ce problème.
Pour info, j'ai un serveur avec la même version que toi de PHP.
Et un autre avec la version 5.0.4 sur une Debian aussi et Apache2.

Je n'ai jamais observé de modification de mon wsdl...
L'espace de nommage, c'est une chose, mais la structure...c'est bizarre.
Sinon heu, un espace de nommage ne correspond jamais à une page existante. Ou rarement du moins. Ca ne sert pas à ça, c'est une référence, c'est tout. Cela sert à confiner une partie de tes éléments dans cet espace de nom.
Bref, ce n'est pas très grave.

Mais ton problème est bizarre...peux-tu montrer ton wsdl ?
0
cloc83 Messages postés 4 Date d'inscription lundi 16 avril 2007 Statut Membre Dernière intervention 3 décembre 2007
6 juil. 2007 à 11:04
Salut ! merci de t'intéresser à mon problème.
"un espace de nommage ne correspond jamais à une page
existante. Ou rarement du moins." => Ok. Mais c'est dommage, car c'est pratique pour ne pas coder trop mal.

Voici mon wsdl (il a été réduit à l'essentiel puisque le problème est systématique).  :
<?xml version="1.0"?>
<definitions name="logiciels"
             targetNamespace="urn:logiciels"
            xmlns:typens="urn:logiciels"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns="http://schemas.xmlsoap.org/wsdl/">
    <types>
        <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
                    targetNamespace="urn:logiciels">
            <xsd:complexType name="reussite">
                <xsd:sequence>
                    <xsd:element name="etat" type="xsd:boolean" minOccurs="1" maxOccurs="1" />
                    <xsd:element name="erreur" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="retourDate">
                <xsd:sequence>
                    <xsd:element name="enMaintenance" type="xsd:boolean" />
                    <xsd:element name="reussite" type="typens:reussite" minOccurs="1" maxOccurs="1" />
                    <xsd:element name="date" type="xsd:string" minOccurs="0" maxOccurs="1" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:schema>
    </types>
    <message name="getServerDate">
       
    </message>
    <message name="getServerDateReponse">
       
    </message>
   
        <operation name="getServerDate">
           
            <output message="typens:getServerDateReponse" />
        </operation>
   

 
        <soap:binding    style="rpc"
                        transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="getServerDate">
            <soap:operation soapAction="urn:logicielsAction" />
           
                <soap:body     use="encoded"
                            namespace="urn:logiciels"
                            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
           
            <output>
                <soap:body     use="encoded"
                            namespace="urn:logiciels"
                            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </output>
        </operation>
   
    <service name="logicielsService">
       
            <soap:address location="...monServiceWeb sur https..."/>
       

    </service>
</definitions>

Un client écrit en PHP me renvoie :
* sur le serveur de test (debian, apache 1.3 et PHP 5.2.3) :
object(stdClass)#1 (3) {
["enMaintenance"]=>
bool(false)
["reussite"]=>
object(stdClass)#4 (1) {
["etat"]=>
bool(true)
}
["date"]=>
string(25) "2007-07-06T10:53:56+02:00"
}

* sur le serveur de prod (debian, apache 1.3 et PHP 5.2.3) :
array(3) {
["enMaintenance"]=>
bool(false)
["reussite"]=>
array(1) {
["etat"]=>
bool(true)
}
["date"]=>
string(25) "2007-07-06T10:53:54+02:00"
}

Veux tu l'enveloppe de réponse ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
6 juil. 2007 à 11:38
Je veux les enveloppes de requête et de réponse, oui.

Tes 2 sorties là, elles sont faites sur quoi ? C'est ujn var_dump de quoi? Parce que dans un cas tu as un objet, dans l'autre un tableau ?
0
cloc83 Messages postés 4 Date d'inscription lundi 16 avril 2007 Statut Membre Dernière intervention 3 décembre 2007
6 juil. 2007 à 12:32
Les 2 sorties sont issues de : var_dump ($clientSoap->getServerDate ($utilisateur))
Le noeud du problème est là : la structure n'est pas la même !
Enveloppe de requête :
<SOAP-ENV:Envelope xmlns:SOAP-ENV= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:logiciels" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getServerDate>

aeMHaRmYD3Hout2a5GbvI9YvetgaKdo12GmNvgZtEv6Xd6IU9BokFwKGyNLNvrk3

</ns1:getServerDate>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Enveloppe de réponse en test :
<SOAP-ENV:Envelope xmlns:SOAP-ENV ="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1= "urn:logiciels" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getServerDateResponse>
<date xsi:type ="ns1:retourDate">
<enMaintenance xsi:type= "xsd:boolean">
false
</enMaintenance>
<reussite xsi:type ="ns1:reussite">
<etat xsi:type= "xsd:boolean">
true
</etat>
</reussite>
<date xsi:type ="xsd:string">
2007-07-06T12:27:13+02:00
</date>
</date>
</ns1:getServerDateResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Enveloppe de réponse en prod :
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:logiciels" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getServerDateResponse>
<date xsi:type ="ns2:Map">

<key xsi:type= "xsd:string">
enMaintenance
</key>
<value xsi:type ="xsd:boolean">
false
</value>


<key xsi:type= "xsd:string">
reussite
</key>
<value xsi:type ="ns2:Map">

<key xsi:type= "xsd:string">
etat
</key>
<value xsi:type ="xsd:boolean">
true
</value>

</value>


<key xsi:type= "xsd:string">
date
</key>
<value xsi:type ="xsd:string">
2007-07-06T12:27:13+02:00
</value>

</date>
</ns1:getServerDateResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Et oui ! la sortie n'est pas la même alors que le code est identique...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ubuntony Messages postés 1 Date d'inscription mercredi 2 mai 2007 Statut Membre Dernière intervention 2 décembre 2007
2 déc. 2007 à 17:48
Bonjour,

j'ai exactement le même problème. As-tu trouvé la solution ?

Ca me sortirai une sacrée épine du pied (ou de la tête...)
0
cloc83 Messages postés 4 Date d'inscription lundi 16 avril 2007 Statut Membre Dernière intervention 3 décembre 2007
3 déc. 2007 à 09:21
Bonjour,

Voici où j'en suis arrivé :
+ php suhosin semble être impliqué dans une majorité de modifications, pour mon cas, mais il ne semble pas être le seul... De plus, c'est un module suffisamment important pour ne pas le désactiver.
Un cas similaire est présenté dans la documentation (mais j'ai mis un peu de temps à le voir) :
 http://fr3.php.net/manual/fr/ref.soap.php commentaire de Darryl20-Jul-2005 08:46

résumé :

Quand on utilise un ComplexType dans le schéma WSDL, il faut ajouter une étape optionnelle afin d'obliger PHP SOAP à l'encoder correctement :
* définir une classe PHP comportant les différentes propriétés correspondant au type complexe du WSDL.

<?php

 class MyComplexDataType {

     public $myProperty1;

     public $myProperty2;

 }
?>
 <complexType name="MyWSDLStructure">

 <sequence>

    <element name="MyProperty1" type="xsd:integer"/>

    <element name="MyProperty2" type="xsd:string"/>

 </sequence>

 </complexType>


* Ensuite on initialise le serveur SOAP avec la structure :

<?php

 $classmap array('MyWSDLStructure'> 'MyComplexDataType');

 $server new SoapServer("http://MyServer/MyService.wsdl", array('classmap'> $classmap))
?>


* Enfin, on retourne une instance de la classe. Le serveur SOAP semble encoder correctement.

<?php

 public function MySoapCall() {

     $o = new MyComplexDataType();

 

     $o->myProperty1 = 1;

     $o->myProperty2 = "MyString";

 

     return $o

 }
?>

Bon usage !
0
Rejoignez-nous