SOAP-ERROR: Encoding: object hasn't 'plat' property

tff
Petit nouveau ! | 1 Messages

20 juin 2012, 17:32

Bonjour,

Je butte sur ce problème depuis 3 jours avec Soap, WSDL, les objets et les complexType

J'ai le message d'erreur suivant

Code : Tout sélectionner

SoapFault exception: [SOAP-ENV:Server] SOAP-ERROR: Encoding: object hasn't 'plat' property SoapClient->__call('carte', Array) #1 {main}
J'essaye de passer en paramètre quel_plat avec 2 entiers et j'attends le plat en retour.
Cela semble venir du passage des paramètres, sans certitude aucune.
Le WSDL est propre, je l'ai généré avec WSDL Editor d'Eclipse.

Le code du client
class quel_plat {
    public $type;
    public $start;
    
    function quel_plat($type, $start) {
        $this->type=$type;
        $this->start=$start;
    }
}

$quel_plat = new quel_plat(1,99);

try {
$wsdl = 'http://www.urlchangee.fr/mon.wsdl';
$client = new SoapClient($wsdl, array('trace' => 1));
$param = new SoapParam($quel_plat, 'tns:carte');
$result = $client->__call('carte',array('obj'=>$quel_carte));
}
Et voici coté serveur
class plat {
  private $IDcarte;
  private $type;
  private $designation;
  private $commentaire;
  private $prix;
  private $image;
  private $pasdancarte;
  private $langue;
  
  public function __construct(){ 
    $this->IDcarte = "mon IDcarte";
    $this->type = "mon type";
    $this->designation = "ma designation";
    $this->commentaire = "mon commentaire";
    $this->prix = 3;
    $this->image = "";
    $this->pasdancarte = false;
    $this->langue = 1;
  }
  
  public function getValues(){  
       $arrToReturn =  
       array(  
           'IDcarte' => $this->IDcarte,  
           'type' => $this->type,  
           'designation' => $this->designation,
           'commentaire' => $this->commentaire,
           'prix' => $this->prix,
           'image' => $this->image,
           'pasdanscarte' => $this->pasdancarte,
           'langue' => $this->langue
       );  
       return $arrToReturn;  
   }  
}

function carte($parametre) {
  // il faudra traiter les parametres
  $plat = new plat();
  return $plat->getValues();
}

ini_set("soap.wsdl_cache_enabled", "0"); // désactivation du cache WSDL
$server = new SoapServer("./mon.wsdl",array('trace' => true));
$server->addFunction("carte");
$server->handle();
Voici les extraits du WSDL

Code : Tout sélectionner

<xsd:complexType name="plat"> <xsd:sequence> <xsd:element name="IDcarte" type="xsd:int"></xsd:element> <xsd:element name="type" type="xsd:int"></xsd:element> <xsd:element name="designation" type="xsd:string"></xsd:element> <xsd:element name="commentaire" type="xsd:string"></xsd:element> <xsd:element name="prix" type="xsd:double"></xsd:element> <xsd:element name="image" type="xsd:base64Binary"></xsd:element> <xsd:element name="pasdancarte" type="xsd:int"></xsd:element> <xsd:element name="langue" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="quel_plat"> <xsd:sequence> <xsd:element name="type" type="xsd:int"></xsd:element> <xsd:element name="start" type="xsd:int"></xsd:element> </xsd:sequence> ... <wsdl:message name="carteRequest"> <wsdl:part element="tns:carte" name="parameters"/> </wsdl:message> <wsdl:message name="carteResponse"> <wsdl:part element="tns:carteResponse" name="parameters"/> </wsdl:message>