Discussion:
Client SOAP en PHP
(trop ancien pour répondre)
geo75
2006-11-24 07:24:35 UTC
Permalink
Bonjour,

Je souhaiterais realiser un petit client SOAP mais je n'ai que ceci.
Comment dois je faire ?

Merci de votre aide.
Cordialement.

-------------------------------------

POST /service1.asmx HTTP/1.1
Host: service.unwebservice.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Header>
<AuthHeader xmlns="http://service.unwebservice.com/">
<UserName>string</UserName>
<Password>string</Password>
</AuthHeader>
</soap12:Header>
<soap12:Body>
<GetAlltotos xmlns="http://service.unwebservice.com/" />
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetAlltotosResponse xmlns="http://service.unwebservice.com/">
<GetAlltotosResult>
<Adtoto>
<totoID>int</totoID>
<GroupID>int</GroupID>
<Name>string</Name>
</Adtoto>
<Adtoto>
<totoID>int</totoID>
<GroupID>int</GroupID>
<Name>string</Name>
</Adtoto>
</GetAlltotosResult>
</GetAlltotosResponse>
</soap12:Body>
</soap12:Envelope>
piotr
2006-11-24 15:34:10 UTC
Permalink
Post by geo75
Bonjour,
Bonjour,
Post by geo75
Je souhaiterais realiser un petit client SOAP mais je n'ai que ceci.
Comment dois je faire ?
1/ Engueuler le Chef de projet qui n'est pas capable de rédiger une doc
convenable.

2/ T'orienter vers PEAR :
http://pear.php.net/package/SOAP
geo75
2006-11-24 17:48:11 UTC
Permalink
Arf s'il y avait un chef de projet, je pense que les demandes comme
celles ci serait filtré.
Seulement voila, c'est pas le cas. Je l'ai directement des
utilisateurs.

Donc le provider du service m'a dit que l'authentification se fait a
partir du headersoap.
( http://www.developer.com/net/net/article.php/2192901 )

En regardant vers SOAP et d'apres la doc cité en liens; dont j'ai
repris un extrait ici de la class AuthHeader

public class AuthHeader : SoapHeader
{
public string UserName;
public string Password;
}

J'ai commencé ce script

<?php
require('SOAP/Client.php');
$client = new
SOAP_Client("http://service.toto.com/service1.asmx?WDSL");
$client->AuthHeader('monlogin', 'monpassword');
?>

Ce a quoi j'ai droit,
Fatal error: Call to undefined function: authheader() ... line 13

Voila, qu'ai je donc fait pas comme il faut ?
Post by geo75
Post by geo75
Bonjour,
Bonjour,
Post by geo75
Je souhaiterais realiser un petit client SOAP mais je n'ai que ceci.
Comment dois je faire ?
1/ Engueuler le Chef de projet qui n'est pas capable de rédiger une doc
convenable.
http://pear.php.net/package/SOAP
xavier
2006-11-25 09:52:01 UTC
Permalink
Post by geo75
Bonjour,
Je souhaiterais realiser un petit client SOAP mais je n'ai que ceci.
Comment dois je faire ?
Merci de votre aide.
Cordialement.
Salut,
si tu bosses en php5 ca sera d'autant plus simple... Voila une classe
client soap etandant le client soap php5 standard pour ce genre de
situations, il te faudra certainement l'adapter un peu mais le principe
y est.
Une fois que le client est instancié, tu peut appeler n'importe quelle
methode comme si tu utilisait un proxy.

par exemple:

$client = new AuthSoapClient($params);
try{
$resp = $client->GetAlltotos(array('Param'='ParamValue');
} catch (SoapFault $e){
print_r($e->getTrace());
}

Mais meme en php4, le principe reste le meme. il faut passer
l'identification dans les headers du message, niveau implementations
soap en php4, tu as le choix entre PEAR/SOAP et NuSoap, a mon avis le
second est plus simple a utiliser, mais apres c'est question de gouts...

Cordialement
Xavier

<?php

define('BASEURI', 'http://www.urlduservice/serversoap');
define('USERNAME', 'soapclientusername');
define('PASSWORD', 'mypassword');
define('WSDL', 'https://www.example.com/wsdl/service.wsdl');
define('AUTH_NS', 'http://www.example.com/soapheader/v1');

class AuthSoapClient extends SoapClient
{

function __construct($inparams = null)
{
$params = array(
'location' => BASEURI,
'trace' => false,
"exceptions" => true,
'soap_version' => SOAP_1_2
);

if (!is_null($params) && is_array($params)){
$params = array_merge($inparams, $params);
}
parent::__construct(WSDL, $params);
}


private function getCustomHeaders()
{

$dataAuth = array(
'UserName' => new SoapVar(USERNAME, XSD_STRING, null, null, null,
AUTH_NS),
'Password' => new SoapVar(PASSWORD, XSD_STRING, null, null, null,
AUTH_NS),
);

$hBody = new SoapVar($dataAuth, SOAP_ENC_OBJECT);
$headers= new SoapHeader(AUTH_NS, 'AuthenticationHeader', $hBody);
return $headers;
}


public function __call($func, $args)
{
return $this->__soapCall($func, $args, array(),
$this->getCustomHeaders());
}

function __doRequest($request, $location, $action, $version) {
$this->_log($request);
return parent::__doRequest($request, $location, $action, $version);
}


}

?>
geo75
2006-11-26 14:14:15 UTC
Permalink
Rebonjour,
Voici le script utilisé, m'indiquant une erreur d'identification. en
appelant une methode qui n'a pas de parametres, puisqu'il doit
normalement me retourner une liste de "Totos".

<?php
require('lib/nusoap.php');
$login="monlogin";
$password="monpassword";
$WSDL = "http://mon.fournisseurr.com/service1.asmx";
$soapaction = "http://mon.fournisseurr.com/GetAllTotos";
$method = 'GetAllTotos';
$parameters = array ();
$namespace = "http://mon.fournisseurr.com/";

// Instanciation
$client = new soapclient($WSDL,true);
$client->setHeaders(
"<AuthHeader xmlns='http://mon.fournisseurr.com/'>
<UserName>$login</UserName>
<Password>$password</Password>
</AuthHeader>
");
$client->soap_defencoding = 'UTF-8';
$client->call($method, $parameters, $namespace, $soapaction,
$header);

avec le schema suivant:
<soap:Header>
<AuthHeader xmlns="http://mon.fournisseur.com/">
<UserName>string</UserName>
<Password>string</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<GetAllTotos xmlns="http://mon.fournisseur.com/" />
</soap:Body>

Les messages suivants apparaissent en provenance du serveur.
Maintenant je me pose donc la question, a savoir si j'ai fait une
bourde,
ou si vraiment les identifiants ne fonctionnent pas, dans ce dernier
cas, je passerais enfin une bonne fin de week end.
Je sais que c'est le WE et remercie les personnes qui prennent le temps
de me repondre.


---- DEBUG ----

HTTP/1.1 500 Internal Server Error
X-Powered-By: ASP.NET

***

2006-11-26 13:50:55.054748 wsdl: got WSDL URL
2006-11-26 13:50:55.054791 wsdl: Parse WSDL
2006-11-26 13:50:55.056156 wsdl: XML error parsing WSDL from
http://mon.fournisseur.com/service1.asmx on line 59: mismatched tag
2006-11-26 13:50:55.056219 wsdl: XML payload:

****

return=array(3) {
["faultcode"]=>
string(11) "soap:Client"
["faultstring"]=>
string(22) "Invalid Login/Password"
["detail"]=>
string(0) ""
}
geo75
2006-12-09 00:19:42 UTC
Permalink
Bonsoir,

Dans la fonction de xavier AuthSoapClient :
function __construct($inparams = null) {
...
24 if (!is_null($params) && is_array($params)) {
25 $params = array_merge($inparams, $params);
26 }
27 parent::__construct(WSDL, $params);
28 }

J'ai ce message d'erreur :
Warning: array_merge() [function.array-merge]: Argument #1 is not an
array in /soap5.php on line 24
Warning: SoapClient::__construct() expects parameter 2 to be array,
null given in /soap5.php on line 27

Voici ce que je fait pour instancier la classe :
$client = new AuthSoapClient($params);
try { $resp = $client->GetAllTotos(array ()); } // 'Param' =>
'ParamValue'
catch (SoapFault $e) { print_r($e->getTrace()); }

La methode GetAllTotos ne prends pas de parametres. Je ne suis pas
assez fort pour trouver l'origine du probleme.
Merci de votre aide.
B***@dino-v.clubint.net
2006-12-10 21:56:08 UTC
Permalink
Désolé, je ne peu pas t'aider.

Par contre, si tu as 1 minute, peu tu me dire qu'elle est cette soupe que
SOAP. ?

Je lis ca partout mis je n'ai pas la moindre idée de l'utilitée.

Bonne journée.
geo75
2006-12-14 06:54:47 UTC
Permalink
Bonjour,

Désolé pour mettre autant de temps pour répondre, je suis débordé
depuis 2 semaines. Et je n'ai pas encore tout compris mais je peux te
rediriger sur deux liens qui m'ont beaucoup aidé.

http://www.soapuser.com/fr/
et
http://www.w3.org/TR/soap12-part1/

Concretement nous avons un fournisseur qui nous a ouvert un service web
qui nous permets de taper directement dans sa base de donnée, via le
web.

C'est tres lents.
Mais ca rends de bon services.

Mais j'imagine qu'il dois y avoir des systems de cache pour les
services web, parce que c hyper lent.
Post by B***@dino-v.clubint.net
Désolé, je ne peu pas t'aider.
Par contre, si tu as 1 minute, peu tu me dire qu'elle est cette soupe que
SOAP. ?
Je lis ca partout mis je n'ai pas la moindre idée de l'utilitée.
Bonne journée.
B***@dino-v.clubint.net
2006-12-17 09:40:34 UTC
Permalink
Ne t'excuse pas, et merci de ta réponse.
Désolé de ne pouvoir t'aider, je ne connais pas, mais j'essairais de
découvrir cela dans les prochains jours.
Post by geo75
Désolé pour mettre autant de temps pour répondre, je suis débordé
depuis 2 semaines. Et je n'ai pas encore tout compris mais je peux te
rediriger sur deux liens qui m'ont beaucoup aidé.
http://www.soapuser.com/fr/
et
http://www.w3.org/TR/soap12-part1/
Concretement nous avons un fournisseur qui nous a ouvert un service web
qui nous permets de taper directement dans sa base de donnée, via le
web.
C'est tres lents.
Mais ca rends de bon services.
Continuer la lecture sur narkive:
Loading...