Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Services Web
Services Web Forum d'entraide pour les services Web en PHP, qui permettent de créer et de consommer facilement des webservices (génération de WSDL etc.). Exemples : SOAP, NuSOAP, REST, SCA-SDO... Avant de poster -> Cours webservices
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/05/2007, 10h16   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Par défaut [SOAP] SOAP et PHP 5

Bonjour,

J'essaye désespérément de faire fonctionner un bête exemple de web service en utilisant l'extension SOAP de PHP 5 mais je ne m'en sors pas.
Voici mon code

"service.php"
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php 
 
  class HelloService { 
  function hello($name) { 
    return "Hello $name !"; 
    } 
  } 
 
  $server = new SoapServer(null, array('uri' => 'http://localhost/service/service.php')); 
  $server->setClass("HelloService"); 
  $server->handle(); 
?>
"client.php"
Code :
1
2
3
4
5
 
<?php 
  $client = new SoapClient(null, array('uri' => 'http://localhost/service/service.php')); 
  print($client->hello("dietrich")); 
?>
lorsque je charge la page client.php avec IE, j'obtiens l'erreur suivante:
Citation:
Citation:
Fatal error: Uncaught SoapFault exception: [Client] SoapClient::SoapClient() [<a href='function.SoapClient-SoapClient'>function.SoapClient-SoapClient</a>]: 'location' option is requred in nonWSDL mode in D:\myweb\client\client.php:2 Stack trace: #0 D:\myweb\client\client.php(2): SoapClient->SoapClient(NULL, Array) #1 {main} thrown in D:\myweb\client\client.php on line 2
Est ce que quelqu'un pourrait m'aider à démêler tout ça ?


Merci d'avance
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 10h21   #2
Membre éclairé
 
Avatar de Asmodean
 
Inscription : février 2006
Messages : 311
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : février 2006
Messages : 311
Points : 346
Points : 346
Envoyer un message via MSN à Asmodean
Je travaille dessus en ce moment aussi...

En fait dans tes arguments pour créer tes Client/Server l'URI ne sert pas à grand chose si ce n'est identifié le webservices (tu peux y mettre tartempion ca le dérangera pas )

Par contre quand tu crée ton client tu dois rajouter dans ton array le champ "location" qui indique l'adresse du web services donc ca donnera quelque chose du genre :

Code :
1
2
3
4
5
6
7
8
 
<?php 
  $client = new SoapClient(null, array(
'uri' => 'http://localhost/service/service.php',
'location' => 'http://localhost/service/service.php'
)); 
  print($client->hello("dietrich")); 
?>
Asmodean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 10h38   #3
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Merci beaucoup pour ton aide

Aprés correction j'ai l'erreur :

Citation:
Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Server] SoapServer::handle() [<a href='function.SoapServer-handle'>function.SoapServer-handle</a>]: PHP-SOAP requires 'always_populate_raw_post_data' to be on please check your php.ini file in D:\myweb\client\client.php:5 Stack trace: #0 [internal function]: SoapClient->__call('hello', Array) #1 D:\myweb\client\client.php(5): SoapClient->hello('dietrich') #2 {main} thrown in D:\myweb\client\client.php on line 5
j'ai rajouté la ligne :
Code :
1
2
 
$server->service($HTTP_RAW_POST_DATA);
dans le fichier service.php

Et maintenant j'ai l'erreur suivante:
Citation:
Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in D:\myweb\client\client.php:5 Stack trace: #0 [internal function]: SoapClient->__call('hello', Array) #1 D:\myweb\client\client.php(5): SoapClient->hello('dietrich') #2 {main} thrown in D:\myweb\client\client.php on line 5
Quelqu'un aurait-il une idée du pb ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 10h44   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Bonjour

Quand tu as ce genre de réponse 'Looks like we got no XML...' ca signifie que tu as une erreur coté serveur et que du coup ton client ne recoit pas la réponse attendue.

Une chose utile est d'utiliser le mode trace quand tu debug.

Ajoutes ca a ton array():
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
 
<?php 
$client = new SoapClient
      (
      null, 
      array
            (
            'uri' => 'http://localhost/service/service.php',
            'location' => 'http://localhost/service/service.php'
            'trace'      => 1,
	    'exceptions' => 0,
            )
      ); 
print($client->hello("dietrich")); 
// Ajoutes des infos sur l'erreur :
echo "<pre>\n";
// Retourne la requete envoyée au serveur
echo "Request :\n".htmlspecialchars($client ->__getLastRequest()) ."\n";
// Retourne la vraie réponse construite sur le serveur 
//(souvent le message d'erreur produit dans le script du serveur 
//que tu ne voies pas)
echo "Response:\n".htmlspecialchars($client ->__getLastResponse())."\n";
echo "</pre>"; 
?>
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 10h47   #5
Membre éclairé
 
Avatar de Asmodean
 
Inscription : février 2006
Messages : 311
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : février 2006
Messages : 311
Points : 346
Points : 346
Envoyer un message via MSN à Asmodean
Alors cette erreur retient là parce que tu risque de la rencontré trèèèèès souvent

Quand il te dit que ton résultat n'est pas formaté selon le XML c'est qu'en général il y a eu : soit un echo fait sur la page du serveur (dans ce cas effectivmeent ce n'est pas du xml valide), soit une erreur php qui a été affiché et donc la page n'affiche plus du XML.

Dans les deux cas va directement sur la page de ton serveur pour voir eventuellemnt les erreurs commises. Quand le serveur est bon normalement il t'affiche une page xml.
Asmodean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h17   #6
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Merci à tous, ça se précise

j'ai viré
Code :
1
2
 
$server->service($HTTP_RAW_POST_DATA);
car apparement 'service' est lié à NuSoap
j'ai activé la ligne: 'always_populate_raw_post_data = On' dans php.ini

et maintenant l'erreur c'est :
Citation:
Bad Request. Can't find HTTP_RAW_POST_DATA
Est ce qu'il faut que je passe la variable HTTP_RAW_POST_DATA via le serveur ?
Y a t-il une fonction pour ça ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h21   #7
Membre éclairé
 
Avatar de Asmodean
 
Inscription : février 2006
Messages : 311
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : février 2006
Messages : 311
Points : 346
Points : 346
Envoyer un message via MSN à Asmodean
Dans quel cas tu obtient cette erreur?

Si c'est en ouvrant le serveur c'est normal.... parce qu'il ne recoit pas les information venant d'un client. Donc a partir de la il faut ouvrir ton client pour voir si ca marche.

Par contre si ca te fais ca en ouvrant le client c'est bizar
Asmodean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h25   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
J'ai testé ton code chez moi comme ca

directement dans mon www, le fichier service.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php 
 
  class HelloService { 
  function hello($name) { 
    return "Hello $name !"; 
    } 
  } 
 
  $server = new SoapServer(null, array('uri' => 'http://localhost/service/service.php')); 
  $server->setClass("HelloService"); 
  $server->handle(); 
?>
Au meme endroit le client.php:
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
 
<?php 
$client = new SoapClient
      (
      null, 
      array
            (
            'uri' 			=> 'http://localhost/service.php',
            'location' 		=> 'http://localhost/service.php',
            'trace'      	=> 1,
			'exceptions' 	=> 0,
            )
      ); 
print($client->hello("dietrich")); 
// Ajoutes des infos sur l'erreur :
echo "<pre>\n";
// Retourne la requete envoyée au serveur
echo "Request :\n".htmlspecialchars($client ->__getLastRequest()) ."\n";
// Retourne la vraie réponse construite sur le serveur 
//(souvent le message d'erreur produit dans le script du serveur 
//que tu ne voies pas)
echo "Response:\n".htmlspecialchars($client ->__getLastResponse())."\n";
echo "</pre>"; 
?>
En sortie je recois :
Code :
1
2
3
4
5
6
7
8
9
10
 
Hello dietrich !
 
Request :
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/service.php" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:hello><param0 xsi:type="xsd:string">dietrich</param0></ns1:hello></SOAP-ENV:Body></SOAP-ENV:Envelope>
 
Response:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/service/service.php" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:helloResponse><return xsi:type="xsd:string">Hello dietrich !</return></ns1:helloResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h27   #9
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Non, c'est bien en ouvrant le client (cad je charge la page client.php dans IE) que j'ai cette erreur
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h30   #10
Membre éclairé
 
Avatar de Asmodean
 
Inscription : février 2006
Messages : 311
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : février 2006
Messages : 311
Points : 346
Points : 346
Envoyer un message via MSN à Asmodean
Tu peux remettre tes deux pages?
Asmodean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h36   #11
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Ok, voilà :

"service.php"
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php 
 
  class HelloService { 
  function hello($name) { 
    return "Hello $name !"; 
    } 
  } 
 
  $server = new SoapServer(null, array('uri' => 'http://localhost/service/service.php')); 
  $server->setClass("HelloService"); 
  $server->handle(); 
?>
"client.php"

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<?php
$client = new SoapClient
      (
      null, 
      array
            (
            'uri' => 'http://localhost/service/service.php',
            'location' => 'http://localhost/service/service.php', 
            'trace' => 1,
	          'exceptions' => 0)); 
print($client->hello("dietrich")); 
// Ajoutes des infos sur l'erreur :
echo "<pre>\n";
// Retourne la requete envoyée au serveur
echo "Request :\n".htmlspecialchars($client ->__getLastRequest()) ."\n";
// Retourne la vraie réponse construite sur le serveur 
//(souvent le message d'erreur produit dans le script du serveur 
//que tu ne voies pas)
echo "Response:\n".htmlspecialchars($client ->__getLastResponse())."\n";
echo "</pre>"; 
?>
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h44   #12
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Tu as bien redémarré ton serveur apache apres avoir changé le php.ini?

Sinon essaie d'enlever les fonctions que je t'ai fait rajouter (entre les <pre>) histoire de voir si ca n'est pas la cause d'une erreur chez toi.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h51   #13
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Citation:
Tu as bien redémarré ton serveur apache apres avoir changé le php.ini?
Oui, plusieurs fois même pour être sûr.
Citation:
Sinon essaie d'enlever les fonctions que je t'ai fait rajouter (entre les <pre>) histoire de voir si ca n'est pas la cause d'une erreur chez toi.
J'ai essayé et j'ai le message suivant :
Citation:
SoapFault exception: [Client] looks like we got no XML document in D:\myweb\client\client.php:11 Stack trace: #0 [internal function]: SoapClient->__call('hello', Array) #1 D:\myweb\client\client.php(11): SoapClient->hello('dietrich') #2 {main}
'comprend pas
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 11h53   #14
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Une dernière possibilité

Mes premières erreurs avec les webservices venaient d'un truc tout bete, j'avais laissé des trucs avant le <?php ou apres le ?> comme un espace, un saut de ligne etc...
Ca causait des erreurs à propos des headers, est-ce que tu n'as pas ce genre de chose dans le script de ton service??
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 12h03   #15
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Dans le fichier service.php le "<php" commence sur la 2eme ligne. Je l'ai mis sur la 1ere mais ça change rien
Est ce que ça pourrait venir de ma version de Apache (2.0.59) ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 12h05   #16
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Non j'ai la meme version d'Apache que toi justement, tu as quelle version de php?
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 12h06   #17
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Php 5.2.2
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 12h17   #18
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Bon ben on a la meme version d'Apache et de php, chez moi ton code marche très bien.

Tes deux fichiers se trouvent bien dans ../www/service/ ?

Coté serveur, essaie d'écrire dans un fichier des infos pour savoir à quel niveau tu arrives

Avant le handle écrit ca:
Code :
1
2
3
4
5
6
 
ob_start();
echo "Request : \n";
print_r($HTTP_RAW_POST_DATA);
file_put_contents("./aaa.txt", ob_get_contents(), FILE_APPEND);
ob_end_clean();
pareil dans la fonction hello, essaie d'écrire dans le fichier "j'entre dans ma fonction", puis apres le handle "j'en sors" pour comprendre...
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 14h01   #19
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Citation:
Tes deux fichiers se trouvent bien dans ../www/service/ ?
client.php se trouve dans : 'http://localhost/client/client.php'
et service.php se trouve dans : 'http://localhost/service/service.php'
mais je ne pense pas que ça change grand chose.
Toutefois, j'ai mis client.php dans 'http://localhost/service' puis je l'ai chargé dans IE à partir de là, mais le résultat est le même.

J'ai mis ton code juste avant le handle. Il me génère le fichier aaa.txt dans lequel il est écrit: Request : et puis c'est tout.
On dirait que la variable $HTTP_RAW_POST_DAT est vide.

Je comprend plus rien là!
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 14h07   #20
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Bon au moins on sait d'ou vient l'erreur. Tu as un probleme avec ton HTTP_RAW_POST_DATA.

PErsonnellement dans mon php.ini je n'ai pas eu besoin de mettre le always_populate_raw_post_data à On c'est toujours commenté.

Mais as-tu modifié le bon php.ini ? celui dans Apache2/bin, parce qu'il y en a plusieurs sur la machine en général et un seul est valide
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h38.


 
 
 
 
Partenaires

Hébergement Web