精简版

我想扩展SoapClient,以便在访问WSDL时在内部执行此操作:

curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

长版

我有一个类似于以下的SOAP请求:
$serviceUrl = 'https://service-url';
$wsdl = $serviceUrl . '?wsdl';

$proxyServiceUrl = 'http://localhost/myproxy.php?url=$serviceUrl';
$proxyWsdl = 'http://localhost/myproxy.php?url=$wsdl';

$options = array(
  'cache_wsdl'    => WSDL_CACHE_NONE,
  'encoding'      => 'utf-8',
  'soap_version'  => SOAP_1_1,
  'exceptions'    => true,
  'trace'         => true,
  'location'      => $proxyServiceUrl
);

$client = new SoapClient($proxyWsdl, $options);

$params = array( /* */ );
$client->someOperation($params);

如您所见,除了代理位,其他所有内容都非常标准。

代理的原因

我编写了代理来满足Web服务提供商的要求,即通过称为siteminder的身份验证系统来处理包括WSDL在内的所有端点。

代理的功能非常简单,如果用linux命令行curl编写,它将是这样的:
curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

确切地说:
* Follow all redirections
* specify location of .pem file (and password)
* specify location of cookie jar

这一切都很好:)

但是最近,服务提供商决定更改其WSDL。

现在,它导入架构文件(.xsd),除了相对于WSDL而言,还不错。

相对于WSDL文件,意味着SoapClient解析器现在从代理位置查找模式文件。错误,找不到!

有关此问题的更多详细信息,请参见:

php SoapClient fails when passed a wsdl with relative path schemas

,所以我的问题是:

我如何重写SoapClient(当然,通过扩展它),以仍然通过siteminder身份验证,而不必通过该额外的代理?

我最初的想法是,我必须以某种方式重写URI访问器函数(如果存在),但是在该领域没有太多文档说明,我不确定从哪里开始。

或者,我可能不得不以某种方式破解SoapServer

我将不胜感激,可以得到任何帮助,包括指向SoapClient内部的任何文档的指针。

最佳答案

如果仅提供.pem文件,您是否研究了SoapClient构造函数的local_cert选项?然后,该客户端对象应保留为该 session 设置的所有cookie。如果您还需要跨 session 持久化cookie,则始终可以从响应中读取它们(使用__getLastResponseHeaders),然后使用__setCookie再次设置它们。

或者,您可以让代理将相对路径替换为绝对路径。毕竟,wsdl本身就是一个XML文档。

或者,您可以将代理变成实际的代理,并使用proxy_host,proxy_port,proxy_login和proxy_password选项。

关于php - 扩展php SoapClient进行siteminder身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6212983/

10-09 18:14