Zend_soap_client pode definir o agente de usuário personalizado?
-
20-09-2019 - |
Pergunta
Eu tenho zend_soap_server. Deve ser testado. Um problema - os modos de teste e desenvolvimento de unidades devem funcionar com diferentes bancos de dados. Isso pode ser feito via .htaccess:
SetEnvIfNoCase User-Agent (.*) APPLICATION_ENV=development
SetEnvIfNoCase User-Agent testing APPLICATION_ENV=testing
Funcionaria bem para mim, eu uso o Zend_soap_client como é para o modo de desenvolvimento/produção e adiciono parâmetro extra para teste. Não há mudanças especiais no código -fonte para o suporte ao teste. O problema - não posso definir o agente de usuário personalizado para (Zend_soap_clientParece que esse parâmetro não é suportado ou não está documentado. Eu tentei fazer a mesma coisa via mod_rewrite e adicionando
new Zend_Soap_Client('...?wsdl&testing');
Mas é necessário alterar o zend_soap_server para suportar o teste de query_string, caso contrário, as ações de sabão não serão refletidas com o 'teste' fora do WSDL. Não é bom na minha opinião.
Concordo que está um pouco mais relacionado com testes de aceitação, não unidade (tenho testes para classes como $server->setClass('classWS')
), mas de qualquer maneira, preciso disso, independentemente da terminologia.
Então, o que funcionaria bem para mim é algo como:
new Zend_Soap_Client($wsdl, array('useragent' => 'testing'));
em testes.
Solução
É possível, mas é um pouco mais complicado do que apenas definir uma opção. A chave é um contexto de fluxo. A função necessária é stream_context_create()
- Por favor, também dê uma olhada "Opções de contexto HTTP".
$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);
EDITAR:
Como o agente de usuário do contexto do fluxo parece ser substituído, outra opção é usar o user_agent
-eption of SoapClient
em si. Mas isso é um pouco mais complicado, pois esta opção não é exposta por 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);
O código acima é mais ou menos um extrato do que acontece em Zend_Soap_Client::_initSoapClientObject()
que inicializa o padrão SoapClient
Quando nenhum objeto personalizado é registrado.