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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : SOAP-ERROR: Encoding: object hasn't 'plat' property

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

par tff » 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>