我有一个非常简单的PHP代码:
<?php
$soap = new SoapClient('https://rev-int.api.us.fleetmatics.com/Vehicle/SageQuest/VehicleService.svc?wsdl', array());
var_dump($soap);
当我将该URL复制到浏览器中时,它加载得很好,没有重定向或任何内容:新的SOAP客户端rev-int.api.us.fleetmatics.com/Vehicle/SageQuest/VehicleService.svc?wsdl
但是当我执行PHP脚本时,在PHP超时后,我得到了以下错误:
Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://rev-int.api.us.fleetmatics.com/Vehicle/SageQuest/VehicleService.svc?wsdl=wsdl0' : failed to load external entity "http://rev-int.api.us.fleetmatics.com/Vehicle/SageQuest/VehicleService.svc?wsdl=wsdl0"
请注意,响应URL是http://rev-int.api.us.fleetmatics.com/Vehicle/SageQuest/VehicleService.svc?wsdl=wsdl0
,它非常相似,但并不十分准确。
也就是说,每个URI都指向HTTP而不是HTTPS,但如果我们在浏览器中简单地更改这一点,页面加载就可以了。
所以问题就变成了:当我们创建PHP SoapClient时,是否可以强制所有URI都遵循HTTPS,而不管WSDL中指定的协议?
1条答案
按热度按时间xdyibdwo1#
WSDL可以独立存在并包含内部的所有内容,或者它可以使用导入从其他位置引入内容(这通常发生在XSD架构中)。
如果它导入了东西,这些导入需要由客户端来解析。如果它们不能被解析,或者是因为位置错误,或者是协议错误,或者其他什么原因,那么客户端就会退出,因为它需要一个完整的WSDL来理解服务的契约以及如何调用它,而不仅仅是它可以加载的部分。
所以你有两个选择:
1.请与服务提供商联系,要求他们修复该问题,以便可以解决所有导入问题。
1.如果您可以下载WSDL和它尝试导入的所有资源,通过在浏览器中打开并将协议更改为https,您可以将它们全部保存在本地磁盘上的同一个文件夹中。然后可以更改WSDL,使用
<wsdl:import .... location="VehicleService.xml" />
导入本地文件,而不是现在这样做。然后可以将本地WSDL提供给客户机,因为现在所有内容都在同一个文件夹中,所以应该可以工作。