【发布时间】:2014-09-25 09:58:35
【问题描述】:
我正在使用soap 客户端连接到一个wsdl 服务。肥皂客户端使用自定义身份验证模式,我通过以下代码将它们添加到 http
$client=new SoapClient(
$wsdl,
array(
'trace' => 1,
"stream_context" => stream_context_create(
array(
"http"=>array(
"header"=> "username: xmluatbank\r\n".
"password: 123456\r\n"
)
)
)
);
标题如下。
POST /myweb/Proxy HTTP/1.1
Host: uat.myweb.com:8080
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.4.19
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 1086
username: xmluatbank
password: 123456
到目前为止一切都很好,然后出现了需要通过代理连接的新请求,所以我将代码更改为:
$client=new SoapClient(
$wsdl,
array(
'trace' => 1,
"stream_context" => stream_context_create(
array(
"http"=>array(
"header"=> "username: xmluatbank\r\n".
"password: 123456\r\n"
)
),
'proxy_host' => $proxy,
'proxy_port' => $proxyport,
'proxy_login' => $proxyusrname,
'proxy_password' => $proxypwd,
)
);
标题变成了这样:
POST http://uat.myweb.com:8080/ctos/Proxy HTTP/1.1
Host: uat.myweb.com:8080
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.9-ZS5.6.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 1086
Proxy-Authorization: Basic YWdyb2JhbmtcanVyaXMudnRjbDpBYmNkMTIx==
您可以看到我现在拥有的流上下文已经消失,所以现在我收到了 wsdl 服务器的身份验证错误。看起来像代理覆盖了 http 标头。所以我尝试将代理添加到http标头而不使用soap代理
$sLogin = base64_encode("$proxyusername:$proxypwd");
$aHTTP['http']['proxy'] = "$proxy:$proxyprot";
$aHTTP['http']['method'] = 'POST';
$aHTTP['http']['header'] = "User-Agent: My PHP Script\r\n";
$aHTTP['http']['header'] .= "Proxy-Authorization: Basic $sLogin";
$aHTTP['http']['header'] .= "username: xmluatbank\r\n"."password: 1234567\r\n";
$context = stream_context_create($aHTTP);
并像这样调用soap客户端:
$client=new SoapClient(
$wsdl,
array(
'trace' => 1,
"stream_context" => $context
)
);
但是这样我得到了肥皂错误并且无法连接到代理。
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://uat.myweb.com:8080/ctos/Proxy?wsdl' : failed to load external entity "http://uat.myweb.com:8080/myweb/Proxy?wsdl"
我不知道如何解决这个问题。我尝试了所有我知道的,请帮助
【问题讨论】:
-
$proxy的值是多少?使用 curl 或类似工具时可以获取 wsdl 吗?示例curl -X POST --proxy 'http://proxyuser:proxypass@proxyaddr:proxyport' -H 'username: xmluatbank' -H 'password: 123456' 'http://uat.myweb.com:8080/myweb/Proxy?wsdl' -
不幸的是银行使用的是windows服务器
-
你可以使用 vbscript/powershell 就像这里描述的stackoverflow.com/questions/2710748/…
标签: php soap proxy wsdl soap-client