2010-03-17 2 views
1

Я пытаюсь использовать tranlsation WebService из MyMemory: http://mymemory.translated.net/doc/spec.phpКак удалить пространства имен в Zend_Soap?

К сожалению, Zend_Soap_Client делает генерировать XML reqest объект, который не распознается службой. Я думаю, это из-за ns1-Attribute (пространство имен) в тегах. Так кто-нибудь знает, как их удалить?

Это в основном то, что я делаю:

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

Тогда я вызываю функцию:

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(); 
} 

Результирующий XML выглядит следующим образом:

<?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> 

И это должно выглядеть на самом деле это:

<?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> 

Благодарим за помощь!

ответ

0

мне пришлось создать обертку:

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

Для приложения Zend 2 вы можете добавить дополнительный класс в контроллер, который заменяет на лету мыла запроса.

Пример:

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); 
    } 
}