代理上的 PHP 肥皂
Posted
技术标签:
【中文标题】代理上的 PHP 肥皂【英文标题】:PHP Soap over Proxys 【发布时间】:2012-11-07 12:27:21 【问题描述】:我已经在这里问了一个与此主题相关的问题,但没有任何帮助。现在我对 SOAP 有了更多的了解,可以提供更多信息,我希望你们中的某个人可能知道它为什么不起作用。
-
我正在尝试在 php 中设置一个小 SoapClient 来访问外部 Web 服务。
此 SoapClient 需要在我当地的大学中通过代理运行。
外部 WSDL 文件通过 IP-Check 保护。
这是我所知道的:
$ExternWSDLFile = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
$LocalUniversityProxy = "proxy.krz.uni-heidelberg.de:8080";
在我总是尝试通过用户/密码访问 WSDL 并且我长时间没有工作之后,他们告诉我,用户/密码不是必需的,WSDL 身份验证只能通过 IP-Check 完成。所以我不必再像我之前想和尝试过的那样给 SoapClient 任何用户/密码组合。
这是我在大学计算机上首先尝试的,注册了 IP 地址:
$wsdl = "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl";
$Client = new SoapClient($wsdl,array('trace' => 1, 'exception' => 0, 'cache_wsdl' => 0));
$Authentification = $Client->authenticate();
var_dump($Client);
var_dump($Authentification);
仍然没有工作,虽然从外部私人 PC 上运行相同的代码,但至少没有给出错误消息,而是一个完全初始化的 Soap-Object。 University-PC 上的此代码仅生成如下错误消息:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl' : failed to load external entity "http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl" in E:\xampp\htdocs\test.php:17 Stack trace: #0 E:\xampp\htdocs\test.php(17): SoapClient->SoapClient('http://search.w...', Array) #1 main thrown in E:\xampp\htdocs\test.php on line 17
所以这肯定是因为 University-Proxy 的缘故!
接下来我尝试在本地获取 WSDL 文件,因为这通常是我从 Google 获得的提示。
$auth = base64_encode('KHD\user:pass');
$header = array("Authorization: Basic $auth");
$Proxy = 'proxy.krz.uni-heidelberg.de:8080';
$Context = stream_context_create(array('http' => array('proxy' => $Proxy,'request_fulluri' => True,'header' => $header,),));
$wsdl = file_get_contents("http://search.webofknowledge.com/esti/wokmws/ws/WOKMWSAuthenticate?wsdl",false,$Context);
在 $wsdl 上使用 print_r() 给了我正确的本地缓存 WSDL 文件。但是现在使用 $wsdl 设置 SoapClient 时,它又因消息而中断:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from '<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="WOKMWSAuthenticateService" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://auth.cxf.wokmws.thomsonreuters.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xs:element name="authenticate" type="tns:authenticate" /> <xs:element name="authenticateResponse" type="tns:authenticateResponse" /> <xs:element name="closeSession" type="tns:closeSession" /> <xs:ele in E:\xampp\htdocs\test.php on line 12
我完全不知道为什么这不起作用。我完全遵循手册并尝试了很多东西。代理不断破坏我的工作,并且在私人/外部 PC 上,此脚本无法使用,因为 IP 不匹配。
我能做些什么来最终让它运行?
感谢您的帮助!
【问题讨论】:
【参考方案1】:旧但认为我在这里分享给其他人。我也遇到了这个问题。似乎有一个应该在 PHP 5.0 中修复的错误?其中 WSDL 文件将尝试在没有代理的情况下进行解析,但肥皂调用确实通过代理。见这里:https://bugs.php.net/bug.php?id=29211 - 我觉得这很烦人。
【讨论】:
以上是关于代理上的 PHP 肥皂的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 DataContractSerializer 从文件中反序列化 WCF 肥皂响应消息?
在 Ubuntu 16.04 上的 Nginx 中设置 phpmyadmin 和反向代理后无法获取 /phpmyadmin