[英]PHP SoapClient unable to access webservice over HTTPS when using proxy
在PHP中使用SoapClient
(版本5.3.10)时遇到一个我无法找到解决方案的问题。
HTTPS和Proxy的组合用于联系Web服务给我带来了真正的痛苦。 有没有办法让这个工作?
给定以下设置:
$WSDL = 'https://(...).php?wsdl';
$params = array(
'proxy_host' => 'localhost',
'proxy_port' => 3128
);
这有效:
$client = new SoapClient($WSDL);
var_dump($client->__getFunctions());
var_dump($client->__call('someFunc', array()));
这在某些时候会产生错误:
$client = new SoapClient($WSDL, $params);
var_dump($client->__getFunctions());
var_dump($client->__call('someFunc', array()));
我尝试了一些曲折尝试以缩小问题的范围:
$WSDL
设置为基于HTTP的服务时,这两种方法均适用。 $WSDL
并将$WSDL
设置为此时,失败的方法会生成函数,但是在尝试调用该函数时会失败。 从使用HTTPS-url初始化客户端到启用了wsdl和代理的PHP退出,并显示以下错误:
Fatal error: Uncaught SoapFault exception:
[WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://(...).php?wsdl' :
failed to load external entity https://(...).php?wsdl
使用本地存储的WSDL定义文件初始化客户端时,PHP退出并显示以下错误:
Fatal error: Uncaught SoapFault exception:
[HTTP] Bad Request in test.php:19
Stack trace: #0 [internal function]: SoapClient->__doRequest
从我的角度来看,这似乎是一个PHP错误,但希望可以找到解决方法。
我必须去诸如NuSoap之类的图书馆吗?
在另一个版本的PHP中是否已解决此问题?
我想念什么吗?
在本地主机上使用Fiddler2代理时遇到此问题。 不得不导出Fiddler的根证书并像这样显式设置cafile
选项
$client = new SoapClient($url, [
'proxy_host' => 'localhost',
'proxy_port' => 8888,
'stream_context' => stream_context_create([
'ssl' => [ 'cafile' => 'C:\path\to\FiddlerRoot.pem' ] ])
]);
...以捕获对服务的https访问。
使用在Base-64 encoded X.509 (.CER)
选项的Personal
存储中,使用DO_NOT_TRUST_FiddlerRoot-CE
条目的certmgr.msc
导出FiddlerRoot.pem
。
我必须使用wsdl文件的本地副本,并且正在使用以下选项:
array(
'trace' => 1,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'proxy_host' => self::PROXY_HOST,
'proxy_port' => self::PROXY_PORT,
'proxy_login' => self::PROXY_USER,
'proxy_password' => self::PROXY_PASS,
)
也许选项trace
或cache_wsdl
会帮助您。
我在防火墙后面。 我必须设置代理和端口才能使代码正常工作。
$client = new SoapClient($wsdl, [
"trace" => 1,
"exceptions" => 1,
"proxy_host" => "PROXY_HOST_STRING",
"proxy_port" => PROXY_PORT_NUMBER
]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.