Zend_Soap_Client可以设置自定义用户代理吗?

时间:2009-10-09 13:05:33

标签: php zend-framework user-agent soap-client

我有Zend_Soap_Server。它应该进行测试。一个问题 - 单元测试和开发模式应该适用于不同的数据库。它可以通过.htaccess:

完成
SetEnvIfNoCase User-Agent (.*) APPLICATION_ENV=development
SetEnvIfNoCase User-Agent testing APPLICATION_ENV=testing

它对我来说很好,我使用Zend_Soap_Client作为开发/生产模式,并添加额外的参数进行测试。测试支持的源代码没有特殊更改。 问题 - 我无法为(Zend_Soap_Client设置自定义用户代理 似乎不支持此参数或未记录此参数。 我尝试通过mod_rewrite和添加

做同样的事情
new Zend_Soap_Client('...?wsdl&testing');

但它需要更改Zend_Soap_Server以支持测试Query_String,否则soap-actions不会在wsdl之外的'testing'中反映出来。在我看来这不好。

我同意它与验收测试有点相关,而不是单位(我对$server->setClass('classWS')等类进行了测试),但无论如何,无论术语如何,我都需要它。

那么,对我来说可行的方法就像:

new Zend_Soap_Client($wsdl, array('useragent' => 'testing'));

在测试中。

1 个答案:

答案 0 :(得分:2)

这是可能的,但它比设置一个选项更复杂。关键是流上下文。所需的功能是stream_context_create() - 请同时查看"HTTP context options"

$context = stream_context_create(array(
    'http' => array(
        'user_agent' => 'testing'
    )
);
$client = new Zend_Soap_Client($wsdl, array('stream_context' => $context));

// or set option after instatiation
$client->setStreamContext($context);

修改

由于流上下文用户代理似乎被覆盖,另一个选项是使用SoapClient本身的user_agent - 选项。但这有点复杂,因为Zend_Soap_Client没有公开此选项。

$client = new Zend_Soap_Client($wsdl);
$options = array_merge($client->getOptions(), array(
    'trace'      => true,
    'user_agent' => 'testing'
));
$soapClient = new Zend_Soap_Client_Common(array($client, '_doRequest'), $wsdl, $options);
$client->setSoapClient($soapClient);

上面的代码或多或少是Zend_Soap_Client::_initSoapClientObject()中发生的事情的摘录,它在没有注册自定义对象时初始化默认SoapClient