pb de web service ... l'appel a la fonction ne marche pas ::

Petit nouveau ! | 5 Messages

20 août 2009, 21:35

Bonjour, j'espere qe quelqu'un pourra m'aider car j'ai un pb avec ma page PHP lorsque j'essaye d'appeler une fonction de mon web service (requete cliente)
C'est comme si la fonction n'etait pas appellée ? bizarre.

bref, le plus simple est que je vous montre les 3 fichiers.

1er fichier : index.php = le client qui appelle la fonction
2 eme fichier : menu_produit.php : le serveur
3 eme fichier le fichier WSDL ( mais je l'ai fait a a la main donc ... )

Si je passe par des appels de fonctions classiques, le code est OK et la requête renvoie bien des données mais des que je tente le web service avec SOAP ... marche pas.

bref, voici le code et la copie d'ecran.
------------------------------------------------------------------------------------------
File 1 : Index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Page d'information de la base </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
</style>
</head>
<body>

<?php
require_once("lib/nusoap.php");
$wsdl = 'http://toto.free.fr/serveur_ws/produit_menu.wsdl';
$options	= array(
'compression'=>true,
'exceptions'=>false,
'trace'=>true
);

$param = array(
'nom_menu' => 'menu grand mere,
'num_element' => 1,
);

$serv_customers = new SoapClient($wsdl, $options);
if( !$serv_customers )
die( "Creation client SOAP non realisée" );

/* C'est comme ci cette fonction n'etait pas appele  !!! */
$TabProduit	= $serv_customers->call('selection_produit',$param);
if( !$TabProduit )
die( "Call non realisée" ); /* C'est ce qui est affiché dans ma page  */

print_r($TabProduit);
print "\n\n";

/* erreur a l'execution : is_soap_fault n'est pas reconnu ??*/
if (is_soap_fault($TabProduit)) {
echo 'fault : ';
var_dump($serv_customers->__getLastRequest());
var_dump($serv_customers->__getLastRequestHeaders());
} else {
echo '<pre>'.var_export($TabProduit, true).'</pre>';
}

//print_r($TabProduit);
//print "\n\n";


//affichage des produits dans une liste de choix
echo "<form name='.....' method='post' action='index.php'>
<label width='250'>Type de produits disponibles : </label>
<select name='Tableau_produit'>";

//ajout dynamique d'items dans la liste//
for ($i=0; $i<sizeof($TabProduit); $i++){
echo $TabProduit[$i];
echo "<option value='".$TabProduit[$i]."'> ".$TabProduit[$i]." </option>";
}
echo "</select>";
echo "</form>";
?>
</body>
</html>
File 2 : produit_menu.php
<?php
require_once ("../lib/nusoap.php");

class produit_menu{

function selection_produit($nom_menu, $num_element)
{
$query = "SELECT distinct libelle_produit from menu, menu_produit, categorie WHERE menu.id_menu=menu_produit.id_menu AND num_element = $num_element AND type_menu = '".$nom_menu."'";

// On se connecte a la base 
$link = mysql_connect('http://toto.free.fr/', toto, 'toto');
if( !$link )
die( "Connexion BD impossible" );

// On selectionne la base
$result = mysql_select_db('toto');
if( !$result )
die( "Echec de la selection de la base" );

// On récupère les infos de la BD
$retour = @mysql_query($query, $link);
if( !$retour )
die( "Echec de la requete SQL" );

//on empile les resultats dans un tableau TabCarb
$Tabproduit=array();
while ($ligne = mysql_fetch_array ($retour)){ 
$Tabproduit[]=$ligne['libelle_produit']; // avec fetch_array on accede directement au nom de champ }
return $Tabproduit;//on retourne le tableau 
}
}

$wsdl	= 'produit_menu.wsdl';
$serveur = new soap_server($wsdl);
$server->setClass('produit_menu');
$server->handle();
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : »;
$server->service($HTTP_RAW_POST_DATA); // Executes the RPC

?>
File 3 : produit_menu.wsdl
<?xml version='1.0' encoding='UTF-8'?>

<definitions name="produit_menu" targetNamespace="urn:produit_menu" 
xmlns:typens="urn:produit_menu" 
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/">
<types>
<schema xmlns="http://www.w3.org/2000/10/XMLSchema">
<complexType name="ArrayOfproduit_menu">
<complexContent>
<restriction base="soapenc:Array"/>
</complexContent>
</complexType>
</schema>
</types>

<message name="selection_produit">
<part name="nom_menu" type="xsd:string"/>
<part name="num_element" type="xsd:integer"/>
</message>

<message name="selection_produitResponse">
<part name="selection_produitReturn" type="ArrayOfproduit_menu"/>	
</message>

<portType name="produit_menuPortType">
<operation name="selection_produit">
<input message="typens:selection_produit"/>
<output message="typens:selection_produitResponse"/>
</operation>
</portType>

<binding name="produit_menuBinding" type="typens:produit_menuPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="selection_produit">
<soap:operation soapAction="urn:produit_menuAction"/>
<input>
<soap:body namespace="urn:produit_menu" use="encoded" 
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body namespace="urn:produit_menu" use="encoded" 
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="produit_menuService">
<port name="produit_menuPort" binding="typens:produit_menuBinding">
<soap:address location="http://toto.free.fr/serveur_ws/produit_menu.php"/>
</port>
</service>
</definitions>

Mammouth du PHP | 2937 Messages

20 août 2009, 22:24

As-tu vérifié si l'extension SOAP était activée chez ton hébergeur ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2009, 22:27

Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 5 Messages

20 août 2009, 22:35

En fait je ne suis pas sur que free effectivement supporte SOAP.
Mais ce serait etonnant quand meme car les web services c'est pas nouveau.
j'ai rajouté la lib SOAP

je pense plutot que mon appel n'est pas correct ou alors que j'ai raté un truc dans mon code PHP du serveur ou alors le fichier wsdl
mais je ne vois pas trop ou ca bloque.

Petit nouveau ! | 5 Messages

20 août 2009, 22:37

zeus, je ferais attention a mettre les balises.
dsl

Mammouth du PHP | 2937 Messages

20 août 2009, 22:39

En fait je ne suis pas sur que free effectivement supporte SOAP.
Effectue un phpinfo () et regarde s'il y a quelque chose sur SOAP. Si tu ne trouves rien, c'est que Free n'a pas activé l'extenstion SOAP ; auquel cas il faudra te tourner vers un hébergeur ayant activé cette extension si tu tiens à utiliser le protocole SOAP.

Petit nouveau ! | 5 Messages

20 août 2009, 22:42

j'ai fais un PHP info et effectivement j'ai rien vu qui ressemble de pres ou de loin a du SOAP chez free

tu connais un hebergeur qui supporte SOAP ?
ou alors comment faire du web services sans SOAP ?

Mammouth du PHP | 2937 Messages

20 août 2009, 22:52

tu connais un hebergeur qui supporte SOAP ?
:google: est ton ami. ;)
ou alors comment faire du web services sans SOAP ?
Que tu passes ou non par le protocole SOAP, faire du web service en PHP passe par des extensions dont il y a de fortes chances qu'elles ne soient pas activées par défaut. :-k

Petit nouveau ! | 5 Messages

21 août 2009, 08:38

je pense que tu as raison au sujet des Webservices il faut forcement que l'hebergeur propose des extensions.
cependant ce serait bien que quelqu'un porte un coup d'oeil sur mon code histoire de voir si a priori c'est OK.
Je l'ai construit a partir d'exemples et donc il y a peut etre des petites erreurs evidentes ... pb comme ca marche pas j'ai un peu de mal a le debugger seul.

ps :
ya une coquille dans le index.php apres grand mere il manque le ' avant le ; : c'est juste un pb de copier/coller le index.php que j'ai est correct.
Ce n'est pas ca le pb.