因为业务需要,需要将数据通过接口推送给第三方公司。开发语言是PHP,第三方公司提供的接口为Webservice。刚开始使用的是http协议,使用PHP的SoapClient将推送业务开发完成后一直运行正常。最近两天收到对方通知,说接口改为https协议,看了下推送日志,最近几天的推送都报错了。
请求的代码如下(url为http协议接口):
// 创建soap请求并初始化请求url $soap = new \SoapClient('请求的http url'); // 执行请求方法 $res = $soap->OperationMethod($send_data);
刚开始想着简单的将调用接口的http协议修改为https就行了,测试之后,程序报错,错误如下:
Error: SoapFault exception: [HTTP] Could not connect to host in 0 [internal function]: SoapClient->__doRequest('<?xml version="...', http://.', '', 1, 0)
因为是接手别人的工作,之前对SoapClient了解不多,只好网上百度搜索相关的解决方法。各种尝试之后(网上的解决方法基本千篇一律),接口调用始终出错。
折腾两天没有搜到解决方法后,尝试使用Google搜索相应的关键词,这次终于搜到几篇比较相近的解决方法(网址在文后列出),通过尝试后,终于解决问题。出现这个问题的原因,在原文解释如下:
The host I was trying to connect is redirecting to another domain name. For some reason, PHP 5.6 doesn't carry the location automatically. So i defined the same soap url in the location options.
大概的意思是访问的主机被重定向到另一个域名,因为某些原因,PHP5.6不会自动携带位置信息。因此需要在Soap的location配置项中定义一个相同的url。
因此,修改代码如下:
// 创建soap请求并初始化请求url(设置location) $options = array('location' => '请求的https url'); $soap = new \SoapClient('请求的https url',$options); // 执行请求方法 $res = $soap->OperationMethod($send_data);
按照以上设置之后,终于请求成功。
以上代码也可以修改为:
// 创建soap请求并初始化请求url(设置location) $soap = new \SoapClient('请求的https url',$options); $soap->__setLocation('请求的https url'); // 执行请求方法 $res = $soap->OperationMethod($send_data);
参考:
1. (本人参考这篇文章的设置,解决问题)https://stackoverflow.com/questions/45403975/php-soap-fault-could-not-connect-to-host
2. https://stackoverflow.com/questions/4318870/soapfault-exception-could-not-connect-to-host