【问题标题】:Can Zend_Soap_Client set custom user-agent?Zend_Soap_Client 可以设置自定义用户代理吗?
【发布时间】:2009-10-09 13:05:32
【问题描述】:

我有 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,否则肥皂动作不会反映在 wsdl 之外的“测试”中。在我看来这不好。

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

所以,对我来说可行的方法是:

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

在测试中。

【问题讨论】:

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


    【解决方案1】:

    这是可能的,但它比仅仅设置一个选项要复杂一些。关键是流上下文。所需的功能是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

    【讨论】:

    • 感谢您的回答!不幸的是,即使 user_agent 是通过 stream_context_create 定义的,我也有 $_SERVER['HTTP_USER_AGENT'] => "PHP-SOAP/5.2.6-3ubuntu4.2" (我尝试了你的两种情况)。我猜,这是因为: header string 请求期间要发送的附加标头。此选项中的值将覆盖其他值(例如 User-agent:、Host: 和 Authentication:)。可能是 Zend 添加了 header 选项,但我不确定
    • 嗨,Alexey,我添加了另一个您可以尝试的选项。似乎通过流上下文传入的用户代理被SoapClient 本身覆盖。
    • 再次感谢您!我意识到 ['http']['user_agent'] 选项不会影响原生 php SoapClient(因此,Zend_Soap_Client 本身并不是一个原因)。我不确定它是否是期望的行为,但无论如何我认为向 Zend 团队报告并询问启用 'user_agent' Zend_Soap_Client 构造选项是有意义的(因为它可以正常工作 - 我检查过)。无论如何,感谢您的解决方案 - 即使看起来不那么漂亮,它也可以工作!
    • 我的最终检查(没有 Zend): $opts = array('http' => array( 'user_agent' => 'testing' ) ); $context = stream_context_create($opts); $client = new SoapClient($wsdl, array( 'context_stream' => $context // 不改变用户代理 //'user_agent' => 'testing' // 取消注释 - 按需要工作!) ); ...所以,我不知道 Zend 为什么禁止这个选项。
    • 这已在 Zend Framework 主干的 r18569 中得到修复,并将成为下一个框架版本(1.9.5 或 1.10.0)的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多