- 1
[Opened] SOAP, return stdClass
Posted by Toto on 09/01/2011 18:04
Bonjour à tous,
Voici mon problème, je suis actuellement en train de développer un controller SOAP (certaines variables sont en dur pour les tests): class defaultCtrl extends jController { <code> /** * Get customer info * @param integer $motdepasse_contrat * @param integer $N_box_contrat * @return stdClass */ function getCustomerInfo() { $rep = $this->getResponse('soap'); $num = $this->intparam('N_box_contrat'); //$birthday = $this->param('Naissance_client'); $password = $this->intparam('motdepasse_contrat'); $cnx = jDb::getConnection('ws'); $rs = $cnx->query(" SELECT clients.Naissance_client, contrats.motdepasse_contrat, clients.Code_client, clients.titre_client, clients.nom_client, clients.adr1_client, clients.adr2_client, clients.code_postal_client, clients.Ville_client, clients.pays_client, clients.mobile_client, clients.telephone_client, clients.fax_client, clients.email_client, contrats.per1_urg_contrat, contrats.Tel1_urg_contrat, contrats.per2_urg_contrat, contrats.tel2_urg_contrat FROM clients INNER JOIN contrats ON (clients.Code_client = contrats.Code_client_contrat) AND (clients.Site_client = contrats.Site_contrat) WHERE contrats.Id_contrat = 19"); $row = $rs->fetch(); if($row == null) throw new SoapFault("Server",'No Register'); $rep->data = $row; return $rep; }
}</code>
Le souci est que lorsque je récupère l'objet sur une autre application Jelix..il est vide.
J'ai pourtant bien un résultat à ma requête SQL, puisque j'ai fait un var_dump (réalisé dans un controller classic car impossible pour un controller SOAP).
Voici mon code de récupération :
function index() { <code> $rep = $this->getResponse('center'); $rep->bodyTpl = 'index'; ini_set('soap.wsdl_cache_enabled', 0); // Chargement du WSDL try { $wsdlURI = SERVER_DB_SOAP."ws~default"; $client = new SoapClient($wsdlURI, array('trace' => 1, 'soap_version' => SOAP_1_1)); } catch (SoapFault $fault) { throw new Exception($fault->getMessage()); } try { $result = $client->__soapCall('getCustomerInfo', array('16175','175')); } catch (SoapFault $fault) { print_r($fault); throw new Exception($fault->getMessage()); } var_dump($result);exit; return $rep; }</code>
Merci d'avance de votre aide.
[Opened] SOAP, return stdClass
Posted by laurentj on 09/01/2011 23:04
bonjour,
réalisé dans un controller classic car impossible pour un controller SOAP
Tu peux toujours utiliser jLog pour stocker tes traces.
Et sinon, as-tu vérifié que le WSDL est bon, en chargeant l'url $wsdlURI dans ton navigateur ? Tu es sûr que SERVER_DB_SOAP."ws~default" est une URL valide pour jelix, et pointant sur le module jWSDL ? Le module jWSDL est installé ?
Je pense aussi qu'il est préférable d'utiliser une vraie classe de ton cru pour le résultat plutôt que stdClass. Essaye voir si ça passe mieux. (voir le manuel pour indiquer à jDb de générer un objet d'une classe précise)
[Opened] SOAP, return stdClass
Posted by Toto on 09/02/2011 10:08
Merci pour cette réponse.
Voici le WSDL accessible depuis "/webservices/ws/www/index.php/jWSDL/WSDL/wsdl?service=ws~default"
<code><wsdl:definitions targetNamespace="http://ip-externe/webservices/ws/www/"><wsdl:types><xsd:schema targetNamespace="http://ip-externe/webservices/ws/www/"><xsd:complexType name="stdClass"><xsd:all/></xsd:complexType></xsd:schema></wsdl:types><message name="getCustomerInfoRequest"><part name="motdepasse_contrat" type="xsd:int"/><part name="N_box_contrat" type="xsd:int"/></message><message name="getCustomerInfoResponse"><part name="getCustomerInfoReturn" type="tns:stdClass"/></message><wsdl:portType name="defaultCtrlPortType"><wsdl:operation name="getCustomerInfo"><wsdl:input message="tns:getCustomerInfoRequest"/><wsdl:output message="tns:getCustomerInfoResponse"/></wsdl:operation></wsdl:portType><binding name="defaultCtrlBinding" type="tns:defaultCtrlPortType"><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="getCustomerInfo"><soap:operation soapAction="http://ip-externe/webservices/ws/www/soap.php?service=ws%7Edefault&method=getCustomerInfo" style="rpc"/><wsdl:input><soap:body use="encoded" namespace="http://ip-externe/webservices/ws/www/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></wsdl:input><wsdl:output><soap:body use="encoded" namespace="http://ip-externe/webservices/ws/www/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></wsdl:output></wsdl:operation></binding><wsdl:service name="defaultCtrl"><wsdl:port name="defaultCtrlPort" binding="tns:defaultCtrlBinding"><soap:address location="http://ip-externe/webservices/ws/www/soap.php?service=ws%7Edefault"/></wsdl:port></wsdl:service></wsdl:definitions> </code>
Je pense que tout la configuration est bonne car quand je passe un type String, j'arrive bien à le récupérer.
Voici tout de même la valeur de SERVER_DB_SOAP
<code> define('SERVER_DB_SOAP','http://..ip-externe../webservices/ws/www/index.php/jWSDL/WSDL/wsdl?service=');</code>
J'ai poursuivi mes tests comme préconisé avec jLog::dump
<code> /** * Get customer info * @param integer $motdepasse_contrat * @param integer $N_box_contrat * @return stdClass */ function getCustomerInfo() { $rep = $this->getResponse('soap'); $num = $this->intparam('N_box_contrat'); //$birthday = $this->param('Naissance_client'); $password = $this->intparam('motdepasse_contrat'); $cnx = jDb::getConnection('ws'); $rs = $cnx->query(" SELECT clients.Naissance_client, contrats.motdepasse_contrat, clients.Code_client, clients.titre_client, clients.nom_client, clients.adr1_client, clients.adr2_client, clients.code_postal_client, clients.Ville_client, clients.pays_client, clients.mobile_client, clients.telephone_client, clients.fax_client, clients.email_client, contrats.per1_urg_contrat, contrats.Tel1_urg_contrat, contrats.per2_urg_contrat, contrats.tel2_urg_contrat FROM clients INNER JOIN contrats ON (clients.Code_client = contrats.Code_client_contrat) AND (clients.Site_client = contrats.Site_contrat) WHERE contrats.Id_contrat = 19"); $row = $rs->fetch(); if($row == null) throw new SoapFault("Server",'No Register'); $rep->data = $row; jLog::dump($rep->data, 'row', 'print'); return $rep; }</code>
Et voici le résultat :
2011-09-02 09:51:58 **.***.***.65 error row: stdClass::__set_state(array( <code> 'Naissance_client' => '19**-01-01 00:00:00', 'motdepasse_contrat' => '16175', 'Code_client' => '590016', 'titre_client' => 'MR', 'nom_client' => 'C****** ****', 'adr1_client' => '33 ***** ***** *****', 'adr2_client' => '', 'code_postal_client' => '**700', 'Ville_client' => 'MARCQ ** ******', 'pays_client' => '', 'mobile_client' => '', 'telephone_client' => '**.**.**.66.50', 'fax_client' => '', 'email_client' => '********bi@hotmail.fr', 'per1_urg_contrat' => 'MME **** *****', 'Tel1_urg_contrat' => '06.**.6*.**.87', 'per2_urg_contrat' => '', 'tel2_urg_contrat' => '',
))
</code>J'ai pas encore bien pris en main tout le fonctionnement, une petite question me vient tout de même où dois-je utiliser mon point d'entrée soap.php que j'ai créé ?
<?php require_once ('../application.init.php'); <code>
require_once (JELIX_LIB_CORE_PATH.'jSoapCoordinator.class.php');
require_once (JELIX_LIB_CORE_PATH.'request/jSoapRequest.class.php');
ini_set("soap.wsdl_cache_enabled", "0"); // disabling PHP's WSDL cache
$config_file = 'soap/config.ini.php';
$jelix = new JSoapCoordinator($config_file); $jelix->request = new JSoapRequest(); $jelix->request->initService(); $jelix->processSoap();
?>
Merci d'avance. </code>[Opened] SOAP, return stdClass
Posted by laurentj on 09/05/2011 11:57
Le soap.php, tu n'as à priori pas à l'appeler par toi même. C'est le générateur de WSDL qui forge les urls des services avec.
Si tout fonctionne avec d'autres types de valeurs de retour, je ne vois pas de qui cloche là. Et les tests unitaires dans jelix montrent que ça fonctionne bien avec des objets en retour.
[Opened] SOAP, return stdClass
Posted by Toto on 09/05/2011 16:37
Merci beaucoup pour ton analyse. De mon coté j'ai trouvé une autre solution pour pouvoir avancer en mettant mon objet dans un tableau et tout fonctionne à merveille.
/** <code> * Get customer info * @param integer $motdepasse_contrat * @param integer $N_box_contrat * @return string[=>] */ function getCustomerInfo() { $rep = $this->getResponse('soap'); $num = $this->intparam('N_box_contrat'); //$birthday = $this->param('Naissance_client'); $password = $this->intparam('motdepasse_contrat'); $cnx = jDb::getConnection('ws'); $rs = $cnx->query(" SELECT clients.Naissance_client, contrats.motdepasse_contrat, clients.Code_client, clients.titre_client, clients.nom_client, clients.adr1_client, clients.adr2_client, clients.code_postal_client, clients.Ville_client, clients.pays_client, clients.mobile_client, clients.telephone_client, clients.fax_client, clients.email_client, contrats.per1_urg_contrat, contrats.Tel1_urg_contrat, contrats.per2_urg_contrat, contrats.tel2_urg_contrat FROM clients INNER JOIN contrats ON (clients.Code_client = contrats.Code_client_contrat) AND (clients.Site_client = contrats.Site_contrat) WHERE contrats.Id_contrat = 19"); $row = $rs->fetch(); if($row == null) throw new SoapFault("Server",'No Register'); if (is_object($row)) { foreach ($row as $key => $value) { $array[$key] = $value; } } else { $array = $row; } $rep->data = $array; jLog::dump($rep->data, 'row', 'error'); return $rep; }</code>
Merci à toi!
- 1