2010-03-17 6 views
1

Je suis en train d'utiliser le webservice tranlsation de MyMemory: http://mymemory.translated.net/doc/spec.phpComment supprimer les espaces de noms dans Zend_Soap?

Malheureusement, Zend_Soap_Client ne générer un objet XML reqest non reconnu par le service. Je suppose que c'est à cause de l'attribut ns1 (Namespace) dans les balises. Alors, quelqu'un sait comment les supprimer?

C'est essentiellement ce que je fais:

$client = new Zend_Soap_Client('http://mymemory.translated.net/otms/?wsdl', array(
    'soap_version' => SOAP_1_1 
)); 

J'appelle la fonction:

try { 
    $client->otmsGet(array(
     'key' => 'xxx', 
      'q' => array(
       'source' => 'Computer Science', 
       'source_lang' => 'en-US', 
       'target_lang' => 'de-DE' 
      ) 
     )); 
} catch(Exception $e) { 
    print $client->getLastRequest(); 
} 

Le XML résultant ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> 
    <SOAP-ENV:Body> 
     <ns1:otmsGet> 
      <ns1:key>xxx</ns1:key> 
      <ns1:q> 
       <ns1:source>Computer Science</ns1:source> 
       <ns1:source_lang>en-US</ns1:source_lang> 
       <ns1:target_lang>de-DE</ns1:target_lang> 
      </ns1:q> 
     </ns1:otmsGet> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Et il devrait effectivement ressembler ceci:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <otmsGet xmlns="http://tempuri.org/"> 
      <key xmlns:SOAPSDK1="http://tempuri.org/">mmDemo123</key> 
      <q xmlns:SOAPSDK2="http://tempuri.org/"> 
       <source>control panel</source> 
       <source_lang>en-US</source_lang> 
       <target_lang>es-ES</target_lang> 
      </q> 
     </otmsGet> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Merci pour votre aide.

Répondre

0

J'ai dû créer un emballage:

class My_Soap_Client_Namespace extends Zend_Soap_Client_Common { 
    protected $namespace = null; 

    function __construct($doRequestCallback, $wsdl, $options) { 
      if (array_key_exists('namespace', $options)) { 
       $this->namespace = $options['namespace']; 
      } 
      parent::__construct($doRequestCallback, $wsdl, $options); 
    } 

    function __doRequest($request, $location, $action, $version, $one_way = null) { 
     if ($this->namespace != null) { 
      $request = preg_replace ('/<ns1:(\w+)/', '<$1 xmlns="' . $this->namespace . '"', $request, 1); 
      $request = preg_replace ('/<ns1:(\w+)/', '<$1', $request); 
      $request = str_replace (array ('/ns1:', 'xmlns:ns1="' . $this->namespace . '"'), array ('/', ''), $request); 
     } 

     return parent::__doRequest ($request, $location, $action, $version); 
    } 
} 
0

Pour une application Zend 2, vous pouvez ajouter une classe supplémentaire à votre contrôleur qui se substitue à la volée la demande du savon.

Exemple:

class MySoapClient extends Zend\Soap\Client { 

    public function _doRequest(Zend\Soap\Client\Common $client, $request, $location, $action, $version, $oneWay = null) 
    { 
     $bad = '<env:Envelope ...>'; 
     $good = '<env:Envelope ...>'; 
     $request = str_replace($bad, $good, $request); 
     // Perform request as is 
     if ($oneWay === null) { 
      return call_user_func(array($client, 'SoapClient::__doRequest'), $request, $location, $action, $version); 
     } 
     return call_user_func(array($client, 'SoapClient::__doRequest'), $request, $location, $action, $version, $oneWay); 
    } 
} 
Questions connexes