【问题标题】:How do I remove the namespaces in Zend_Soap?如何删除 Zend_Soap 中的名称空间?
【发布时间】:2010-03-17 17:35:46
【问题描述】:

我正在尝试使用 MyMemory 中的翻译网络服务:http://mymemory.translated.net/doc/spec.php

不幸的是,Zend_Soap_Client 确实生成了一个服务无法识别的 XML 请求对象。我猜这是因为标签中的 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>

感谢您的帮助!

【问题讨论】:

    标签: php zend-framework soap wsdl zend-soap


    【解决方案1】:

    我必须创建一个包装器:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-07-16
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2013-08-06
        • 1970-01-01
        • 2015-10-05
        相关资源
        最近更新 更多