精简版
我想扩展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/