2017-07-11 6 views
1

J'ai besoin d'ajouter un espace de nom dans la réponse Soap. J'utilise php et SoapServer. Ma réponse commence comme ceci:php - SoapServer - Besoin d'ajouter un espace de noms dans la réponse Soap

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0"> 

et j'ai besoin pour commencer comme ceci:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0" xmlns:ns2="urn:query:type:v2.0"> 

Mon code en PHP est comme ça et je ne sais pas comment continuer:

class Service 
{ 
// FUNCTIONS 
} 

$options= array('uri'=>'urn:query:request:v2.0', 
    'cache_wsdl' => WSDL_CACHE_NONE); 
$server=new SoapServer("Service.wsdl",$options); 

$server->setClass('Service'); 
$server->addFunction(SOAP_FUNCTIONS_ALL); 

$server->handle(); 

Merci

Répondre

1

Les espaces de noms sont ajoutés dynamiquement au corps de la réponse au savon. Tant qu'il n'y a pas d'élément avec l'espace de noms nécessaire dans le corps de savon, il n'apparaîtra pas. Vous devez le déclarer dans la réponse. Voici un exemple simple.

Le savon Demande de classe Handling

Dans cette classe normalement les fonctions du service de savon sont définis. Ici arrive la magie. Vous pouvez initer les objets SoapVar avec l'espace de noms dont ils ont besoin.

class Response 
{ 
    function getSomething() 
    { 
     $oResponse = new StdClass(); 
     $oResponse->bla = 'blubb'; 
     $oResponse->yadda = 'fubar'; 

     $oEncoded = new SoapVar(
      $oResponse, 
      SOAP_ENC_OBJECT, 
      null, 
      null, 
      'response', 
      'urn:query:type:v2.0' 
     ); 

     return $oEncoded; 
    } 
} 

Avec propre classe SoapVar de PHP, vous pouvez ajouter des espaces de noms à un nœud. Le cinquième paramètre est le nom du nœud tandis que le sixième paramètre est l'espace de noms auquel le nœud appartient.

Le serveur Soap

$oServer = new SoapServer(
    '/path/to/your.wsdl', 
    [ 
     'encoding' => 'UTF-8', 
     'send_errors' => true, 
     'soap_version' => SOAP_1_2, 
    ] 
); 

$oResponse = new Response(); 

$oServer->setObject($oResponse); 
$oServer->handle(); 

Si la fonction de service getSomething est appelé, la réponse ressemblerait le code XML suivant.

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:query:type:v2.0"> 
    <env:Body> 
     <ns1:Response> 
      <ns1:bla>blubb</ns1:yadda> 
      <ns1:blubb>fubar</ns1:blubb> 
     </ns1:Response> 
    </env:Body> 
</env:Envelope> 

Comme vous pouvez le voir l'espace de noms que nous avons fourni à l'objet SoapVar apparaît dans le nœud de l'enveloppe de la réponse du savon.

+0

Merci. Votre réponse a été très utile. – samug