WithCoderWithCoderWithCoder

PHP使用Soap请求https(webservice)接口:Could not connect to host

    因为业务需要,需要将数据通过接口推送给第三方公司。开发语言是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了解不多,只好网上百度搜索相关的解决方法。各种尝试之后(网上的解决方法基本千篇一律PHP使用Soap请求https(webservice)接口:Could not connect to host(图1)),接口调用始终出错。

    折腾两天没有搜到解决方法后,尝试使用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

欢迎分享交流,转载请注明出处:WithCoder » PHP使用Soap请求https(webservice)接口:Could not connect to host