尝试使用本地创建的SOCKS代理,使用ssh -D通过跳转服务器代理soap调用。
我的网络服务器无法直接访问我尝试使用的设备,所以我想我可以使用SSH代理。
我可以从linux服务器上的Web浏览器中找到wsdl,但是curl失败了。
我已经使用TCP Dump验证了流量从网络接口流出,并且在尝试使用代码时没有达到代理的环回。如果我使用Web浏览器,它会像预期的那样通过环回代理。
<?
require_once 'SOAP/Client.php';
$username = "testuser";
$password = "testpass";
$hostname='10.200.96.86';
$soapoptions = array('namespace' => 'urn:iControl');
$wsdl_url ="https://$hostname/iControl/iControlPortal.cgi?WSDL=LocalLB.Pool";
$proxy_parms = array( 'user' => $username, 'pass' => $password);
$params = array();
$client = new SOAP_Client($wsdl_url, true, '', $proxy_parms );
$client->setOpt('curl', CURLOPT_VERBOSE, true)
$client->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$client->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$client->setopt('curl', CURLOPT_PROXYTYPE, "CURLPROXY_SOCKS5");
$client->setopt('curl', CURLOPT_PROXY, "localhost:1080"); // 1080 is your -D parameter
$response = $client->call('get_list', $params, $soapoptions);
if (PEAR::isError($response)) {
print "an error occurred in the call " . $response;
}
?>
答案 0 :(得分:0)
在我想到修复问题后我会说here我需要说,这只适用于“非WSDL”模式。
你有两种可能的WSDL over Socks。
使用curl(使用SOCKS5选项)自己加载WSDL,并使用上述博客文章中的ProxySoapClient类。并初始化您的客户:
new ProxySoapClient($wsdlContentFromCurl, $options);
但可能是你的WSDL有更多的依赖关系,以后会尝试获取。这不会奏效。所以这是第二种方法:
使用ssh,polipo和代理选项。
启动ssh ssh -C2qTnN -D 8081 user@domain
这将在端口8081上创建一个SOCKS5代理。启动polipo polipo socksParentProxy=localhost:8081
这将在端口8123上创建一个WEB代理到端口8081上的SOCKS5代理。(通常polipo是由inet.d启动,因此您可以在运行本地命令之前停止此操作)
现在在PHP中使用:
$client = new SoapClient(
$theUrlToWSDL,
[
'proxy_host' => 'localhost',
'proxy_port' => 8123,
]
);
答案 1 :(得分:-2)
在我想到解决这个问题后,http://www.livingwithphp.com/php-soap-client-socks-proxy/我要说,这只适用于&#34;非WSDL&#34;模式。
你有两种可能的WSDL over Socks。
1。)使用curl(使用SOCKS5选项)自己加载WSDL,并使用上述博客文章中的ProxySoapClient类。并使用以下命令初始化您的客户端:new ProxySoapClient($ wsdlContentFromCurl,$ options);
但可能是你的WSDL有更多的依赖关系,以后会尝试获取。这不会奏效。所以这是第二种方法:
2.。)使用ssh,polipo和代理选项。
启动ssh ssh -C2qTnN -D 8081 user@domain
这将在端口8081上创建SOCKS5代理。
启动polipo polipo socksParentProxy=localhost:8081
这将在端口8123上创建一个WEB代理到端口8081上的SOCKS5代理。(通常,polipo由inet.d启动,因此你可以在运行本地命令之前停止它)
现在在PHP中使用
$client = new SoapClient(
$theUrlToWSDL,
[
'proxy_host' => 'localhost',
'proxy_port' => 8123,
]
);