2010-09-21 6 views
3

est ici l'appel que je suis en train de faire:Passage de nusoap à PHP5 Savon - ont besoin d'un véritable essor

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <urn:SessionHeader xmlns:urn="http://www.mywebservice.com/webservices/SoapService" xmlns="http://www.mywebservice.com/webservices/SoapService" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <urn:sessionId xmlns:urn="http://www.mywebservice.com/webservices/SoapService">LOGINTOKEN=your instance name</urn:sessionId> 
    </urn:SessionHeader> 
</soap:Header> 
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <ns2:login xmlns:ns2="http://www.mywebservice.com/webservices/SoapService"> 
     <wsUser> 
      <entityId>0</entityId> 
      <password>your password</password> 
      <username>your username</username> 
     </wsUser> 
    </ns2:login> 
</soap:Body> 

Mais je vais avoir du mal à trouver comment mettre en place les en-têtes personnalisés dans Savon de PHP5. Avec nuSoap je pourrais juste mettre le tout dans une variable et ensuite utiliser $client->setHeader($headerVar) mais je ne trouve rien de similaire en PHP. Si je pouvais reproduire cet appel, je peux comprendre le reste. Toute aide serait appréciée!

Merci d'avance!

Mise à jour: J'ai suivi le tutoriel après le didacticiel et j'ai lu les documents PHP, mais rien ne semble fonctionner. Je peux faire ce que je veux avec curl (ainsi que nuSoap) mais je pensais que le savon natif PHP5 serait plus facile et peut-être plus stable. Je suppose que non ...

Mise à jour 2 Voici le code que je suis en train:

$soapurl = 'http://www.mywebservice.com/webservices/SoapService?wsdl'; 
$client = new SoapClient($soapurl,array('trace'=>true)); 
$token = "LOGINTOKEN=your instance name"; 

$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token)); 
$client->__setSoapHeaders($header); 


$client->login(array("wsUser" => array('entityId'=>'0','username'=>'my username','password'=>'my password'))); 

Et l'erreur que je reçois:

**Fatal error**: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header in C:\www\soap\index.php:12 Stack trace: #0 C:\www\soap\index.php(12): SoapClient->__call('login', Array) #1 C:\www\soap\index.php(12): SoapClient->login(Array) #2 {main} thrown in C:\www\soap\index.php on line 12 

Mise à jour 3 Il ressemble à la "sessionId" est envoyé en tant que "clé" avec le jeton envoyé en tant que "valeur".

*REQUEST*: 
    <?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.mywebservice.com/webservices/SoapService"> 
<SOAP-ENV:Header> 
<ns1:SessionHeader><item><key>sessionId</key><value>LOGINTOKEN=my token</value></item> 
</ns1:SessionHeader> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body><ns1:login><wsUser><entityId>0</entityId><password>my password</password><username>my username</username></wsUser></ns1:login></SOAP-ENV:Body></SOAP-ENV:Envelope> 
+0

SoapClient :: __ setSoapHeaders() ne fait pas ce que vous voulez? http://php.net/soapclient.setsoapheaders – Inigoesdr

+0

Il pourrait, et j'ai expérimenté avec l'implémenter, mais je ne peux pas comprendre comment le rendre le format exact. – TerryMatula

Répondre

2

Avez-vous essayé la classe SoapHeader pour construire votre en-tête? Est-ce que quelque chose comme ça fonctionnerait?

//Assume $token holds your login token and $client holds the SoapClient object 
$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token)); 
$client->__setSoapHeaders($header); 

Cela devrait créer l'en-tête et l'ajouter à SoapClient. Chaque appel suivant utilisant SoapClient aura alors cet ensemble d'en-tête. Quant au format exact, je ne m'inquiéterais pas trop. Vous échantillonnez XML utilise un alias pour l'espace de noms appelé urn. PHP n'arrivera probablement pas exactement au même alias mais cela devrait fonctionner. Aussi je ne pense pas que déclarer les xmlns dans chaque élément enfant est nécessaire. Je pense qu'un nœud enfant hérite automatiquement de l'espace de noms de son parent en XML, mais je ne suis pas sûr à 100% de cela. La ligne de fond est que tant que les bonnes URL sont déclarées dans les espaces de noms, cela devrait aller, même si le XML ne correspond pas exactement à votre exemple.

Autre chose que vous pourriez essayer: avez-vous activé le traçage dans SoapClient? C'est l'un des paramètres qui peuvent être transmis au constructeur et il vous permet d'afficher les requêtes et les réponses XML SOAP. Si cela ne fonctionne toujours pas avec la classe SoapHeader, essayez d'activer le suivi pour voir ce qui est envoyé et reçu.

+0

Impossible de le faire fonctionner. Je reçois une "exception SoapFault Uncaught". Voir mon édition pour plus d'informations ... – TerryMatula

+0

Le SoapFault est levé si la réponse de savon du service contient une erreur (erreur de savon). Pouvez-vous attraper l'exception et accéder au message d'erreur? Cela pourrait vous donner des informations précieuses sur ce qui se passe. Essayez également d'activer le traçage et de supprimer le code XML envoyé et reçu. Pourriez-vous poster quand vous avez fait cela et je verrai si je peux penser à d'autres suggestions. – Jeremy

+0

vient de soumettre une modification à la question. Merci pour l'aide. – TerryMatula