[Web Service][SOAP/WSDL] Problèmes de fonctions
Bonjour à tous et à toutes.
Dans le cadre d'un stage je dois commencer le développement d'un web-service en SOAP, Php et WDL. Bon, php, je gère pas trop mal, mais SOAP et WSLD et SOAP, je ne commençais pas du tout avant de me plonger dans la doc il y a déjà quelques jours de cela et je galère un petit peu, même pour des exemple tout simple.
J'ai donc tentés deux ou trois trucs pas trop compliqués (en théorie), et je commence petit à petit à comprendre l'architecture de la chose. Seulement je me retrouve confrontés à quelques problèmes, sans doute bénins, mais je ne sais pas trop par où chercher.
Le premier vient d'un problème d'ajout de fonction. En fait pour le moment j'ai instancié trois fonctions du coté server, le problème, c'est que lorsque je tente de les utiliser du coté client, elles me retournent exactement la même chose...
Voici le code du server :
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 37 38 39 40
|
<?php
//Connection à la base mysl
include_once("connexionBase.php") ;
include_once("doctorant.class.php") ;
//include_once("anneeUniversitaire.class.php") ;
// première étape : désactiver le cache lors de la phase de test (pour éviter des problèmes si changement du fichier wsdl)
ini_set("soap.wsdl_cache_enabled", "0");
// on indique au serveur à quel fichier de description il est lié
$serveurSOAP = new SoapServer('essai.wsdl');
// ajouter les fonctions au serveur
$serveurSOAP->addFunction(SOAP_FUNCTIONS_ALL);
// lancer le serveur
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
$serveurSOAP->handle();
}else{
echo 'désolé, je ne comprends pas les requêtes GET, veuillez seulement utiliser POST';
}
function getAnneeUniversitaireById($id){
return 'Hello ceci est une fonction pour recuperer les annees universitaire par id : '.$id;
$testDoc = new Doctorant() ;
}
function getAllInscriptionAdministrativeByThese($param1, $param2){
return 'Ceci est la fonction des inscription administrative par these avec en paramètre : '.$param1.' , '.$param2.'';
$testDoc = new Doctorant() ;
}
function getAllAnneeUniversitaire(){
return 'Ceci est la fonction pour recuperer les année suniversitaires';
$testDoc = new Doctorant() ;
}
?> |
Le code du client :
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
<?php
// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");
// lier le client au fichier WSDL
$clientSOAP = new SoapClient('essai.wsdl');
echo '<pre>' ;
//print_r($_SERVER).'<br/><br/>' ;
//print_r($_POST).'<br/><br/>' ;
echo '</pre>' ;
/* $test = new stdClass() ;
$test->code = "FR" ;
$test->libelle = "France" ;
$test->nationalite = "Française" ; */
$essai1 = 'these' ;
$essai2 = 'essai' ;
$id=1;
var_dump($clientSOAP->__getFunctions()); //Affiche les fonctions disponibles
// var_dump($clientSOAP->__getTypes()); //Affiche tous les types du wsdl
echo '<pre>' ;
//print_r($test) ;
//print_r($testDoc) ;
echo '</pre>' ;
if(isset($_POST['id'])){
$id = (htmlspecialchars($_POST['id']));
}
?>
<form action="client2.php" method="post">
<input type="text" name="id" value="<?php if( isset($_POST['id'])) echo htmlentities(trim($_POST['id'])); ?>">
<input type="submit" name="valider1" value="Valider">
</form>
<?php
// executer les méthodes
echo $clientSOAP->getAnneeUniversitaireById($id).'<br>';
echo $clientSOAP->getAllInscriptionAdministrativeByThese($essai1, $essai2).'<br>';
echo $clientSOAP->getAllAnneeUniversitaire();
?> |
Et ce qui est concerné dans le fichier WSDl (parce que si je le met en entier ça va être vraiment trop long, déjà que ça l'est...)
Nb : Le fichier WSDL m'a été fourni et je n'y ait pas touché au niveau de la structure des données
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
<wsdl:definitions name="AdministratifServiceImplService" targetNamespace="http://webServices.amethis.cri.ubs.univ.fr/"
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/">
<wsdl:types>
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://localhost/soap/">
<xs:complexType name="anneeUniversitaire">
<xs:sequence>
<xs:element name="actif" type="xs:boolean"/>
<xs:element minOccurs="0" name="code" type="xs:string"/>
<xs:element minOccurs="0" name="libelle" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="inscriptionAdministrative">
<xs:sequence>
<xs:element minOccurs="0" name="adresse" type="tns:adresse"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="aideFinanciere" nillable="true" type="tns:aideFinanciere"/>
<xs:element minOccurs="0" name="anneeUniversitaire" type="tns:anneeUniversitaire"/>
<xs:element name="ater" type="xs:boolean"/>
<xs:element minOccurs="0" name="codeEcoleDoctorale" type="xs:string"/>
<xs:element name="codeIndividuApogee" type="xs:int"/>
<xs:element minOccurs="0" name="dateCreation" type="xs:dateTime"/>
<xs:element minOccurs="0" name="equipeDeRecherche" type="tns:equipeDeRecherche"/>
<xs:element minOccurs="0" name="etablissementAter" type="tns:etablissement"/>
<xs:element minOccurs="0" name="etablissementCollecte" type="xs:string"/>
<xs:element minOccurs="0" name="etatInscription" type="xs:string"/>
<xs:element minOccurs="0" name="regimeInscription" type="tns:regimeInscription"/>
<xs:element minOccurs="0" name="uniteDeRecherche" type="tns:uniteDeRecherche"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getAnneeUniversitaireById" type="tns:getAnneeUniversitaireById"/>
<xs:complexType name="getAnneeUniversitaireById">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getAnneeUniversitaireByIdResponse" type="tns:getAnneeUniversitaireByIdResponse"/>
<xs:complexType name="getAnneeUniversitaireByIdResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:anneeUniversitaire"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getAllInscriptionAdministrativeByThese" type="tns:getAllInscriptionAdministrativeByThese"/>
<xs:complexType name="getAllInscriptionAdministrativeByThese">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
<xs:element name="arg1" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getAllInscriptionAdministrativeByTheseResponse" type="tns:getAllInscriptionAdministrativeByTheseResponse"/>
<xs:complexType name="getAllInscriptionAdministrativeByTheseResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:inscriptionAdministrative"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getAllAnneeUniversitaire" type="tns:getAllAnneeUniversitaire"/>
<xs:complexType name="getAllAnneeUniversitaire">
<xs:sequence/>
</xs:complexType>
<xs:element name="getAllAnneeUniversitaireResponse" type="tns:getAllAnneeUniversitaireResponse"/>
<xs:complexType name="getAllAnneeUniversitaireResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:anneeUniversitaire"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:portType name="AdministratifService">
<wsdl:operation name="getAnneeUniversitaireById">
<wsdl:input message="tns:getAnneeUniversitaireById" name="getAnneeUniversitaireById">
</wsdl:input>
<wsdl:output message="tns:getAnneeUniversitaireByIdResponse" name="getAnneeUniversitaireByIdResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllInscriptionAdministrativeByThese">
<wsdl:input message="tns:getAllInscriptionAdministrativeByThese" name="getAllInscriptionAdministrativeByThese">
</wsdl:input>
<wsdl:output message="tns:getAllInscriptionAdministrativeByTheseResponse" name="getAllInscriptionAdministrativeByTheseResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllAnneeUniversitaire">
<wsdl:input message="tns:getAllAnneeUniversitaire" name="getAllAnneeUniversitaire">
</wsdl:input>
<wsdl:output message="tns:getAllAnneeUniversitaireResponse" name="getAllAnneeUniversitaireResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AdministratifServiceImplServiceSoapBinding" type="tns:AdministratifService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getAnneeUniversitaireById">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getAnneeUniversitaireById">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAnneeUniversitaireByIdResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllInscriptionAdministrativeByThese">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getAllInscriptionAdministrativeByThese">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAllInscriptionAdministrativeByTheseResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getAllAnneeUniversitaire">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getAllAnneeUniversitaire">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAllAnneeUniversitaireResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions> |
Bon le code n'est pas très propre et y'a un peu des commentaires de partout mais c'était pour tester... Si vous aviez des pistes (ou une solution à m'expliquer :D ) pour ce problème tout bête, je suis preneuse.
De même j'en profite pour demander, parce qu'on ne trouve pas vraiment énormément de documentation là-dessus, le système de classmap pour associer les compextype et les classes php. J'ai donc a classe suivante, comment puis-je la relier au fichier WSDL ?
Code:
1 2 3 4 5 6 7 8
|
<?php
class anneeUniversitaire{
public $actif ;
public $code ;
public $libelle ;
}
?> |
Oui je sais mettre en public c'est mal mais pour l'instant c'est juste pour faire mes tests... Donc si vous avez une idée là-dessus aussi ^^
Voila, ça fait beaucoup à lire je suis désolé... Mais pas facile de se plonger là-dedans c'est dur de s'y retrouver parfois. Merci de votre (future) aide ! ;)