Bonjour,
j'ai essayé de créer un ws en PHP (en ayant activé l'extension php_soap).
Voici le fichier WSDL :
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
| <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="service"
targetNamespace="serviceABCD"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="serviceABCD"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
>
<!-- Définition des types personnalisés -->
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="serviceABCD">
<xsd:element name="getDicton" type="tns:getDicton" />
<xsd:element name="getDictonResponse" type="tns:getDictonResponse" />
<xsd:complexType name="getDicton">
<xsd:sequence />
</xsd:complexType>
<xsd:complexType name="getDictonResponse">
<xsd:sequence>
<xsd:element name="return" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<!-- Abstraction de plus haut niveau des paramètres -->
<!-- PortType : contient des abstractions de haut niveau des opération du service web -->
<wsdl:message name="getDicton">
<wsdl:part name="parameters" element="tns:getDicton"></wsdl:part>
</wsdl:message>
<wsdl:message name="getDictonResponse">
<wsdl:part name="parameters" element="tns:getDictonResponse"></wsdl:part>
</wsdl:message>
<wsdl:portType name="IServiceABCD">
<wsdl:operation name="getDicton">
<wsdl:documentation>Méthode qui retourne un dicton..</wsdl:documentation>
<wsdl:input message="tns:getDicton" />
<wsdl:output message="tns:getDictonResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<!-- Binding : définit le protocole à utiliser pour invoquer le service web -->
<wsdl:binding name="BindingServiceABCD" type="tns:IServiceABCD">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getDicton">
<soap:operation soapAction="serviceABCD/getDicton" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<!-- Définition du service à proprement parler -->
<!-- Contient l URL du service -->
<wsdl:service name="ServiceABCD">
<wsdl:port name="PortServiceABCD" binding="tns:BindingServiceABCD">
<soap:address location="http://localhost/ServiceABCD/index.php" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions> |
Voici le serveur :
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
|
<?php
include_once('./modele/class.Commune.php');
// Si on a le paramètre wsdl, on doit afficher le wsdl
if (isset($_GET['wsdl']))
{
header("content-type: application/xml");
$file = "./service.wsdl";
$fp = fopen($file, "r");
$fluxXml = fread($fp, filesize($file));
fclose($fp);
echo $fluxXml;
exit;
}
// première étape : désactiver le cache lors de la phase de test
ini_set("soap.wsdl_cache_enabled", "0");
// on indique au serveur à quel fichier de description il est lié
$serveurSOAP = new SoapServer('./service.wsdl');
// ajouter la fonction getDicton au serveur
$serveurSOAP->addFunction('getDicton');
// 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 getDicton() {
return utf8_encode("Un petit dicton...");
}
?> |
Je voudrais pouvoir consommer ce service web en java. J'ai utilisé l'outil wsimport fournit avec jax-ws. Mais l'appel à ma méthode ne fonctionne pas.
J'ai essayé de construire un client php dont voici le code :
1 2 3 4 5 6 7 8 9 10
| <?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('./service.wsdl');
echo "<br>Bonjour !!!<br>";
echo "dicton : " . $clientSOAP->getDicton();
?> |
Mais lorsque j'exécute ma page client, voici le résultat affiché à l'écran :
Bonjour !!!
Catchable fatal error: Object of class stdClass could not be converted to string in I:\apache\www\ServiceABCD\client.php on line 8
Si je remplace :
echo "dicton : " . $clientSOAP->getDicton();
par
1 2 3
| echo "<pre>";
print_r($clientSOAP->getDicton());
echo "</pre>"; |
j'obtiens alors le résultat suivant :
Bonjour !!!
stdClass Object
(
)
Avez-vous une idée pourquoi mon client PHP ne fonctionne pas ?
Idem pour le client JAVA ?
Merci beaucoup.
F.
Partager