在PHP中调用webservice发布的服务(__Call),报如下错:
Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in Test.php:18 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://xxx.xxx....', 'urn:webservi...', 1, 0) #Test.php(18): SoapClient->__call('Login', Array) #2 {main} thrown in
报该错误的其中一个原因是:在客户端等待的时间内,未收到服务器端返回的信息。
于是在客户端的请求页面中,加入代码(ini_set('default_socket_timeout',80);),延长客户端的等待时间,此时,返回错误信息:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://xxx.xxx.xxx.xxx:80/webserviceTest.php?wsdl' in Test.php:13 Stack trace: #0 Test.php(13): SoapClient->__call('Login', Array) #1 {main} thrown in Test.php on line 13
查看了测试代码:
$ws = "http://xxx.xxx.xxx.xxx/webserviceTest.php";
$client = new SoapClient($ws);
$Token = $client->__Call('Login',$d);
在执行上面的第三行代码时报的错。
查看了代码中php调用webservice的全过程,
1、发布 webservice 服务地址;
2、通过 SoapClient 类生成soap客户端(Get方法);
3、soap 客户端 调用具体的服务方法(POST方法);
3.1 通过 SoapServer 类生成soap服务端(Get方法);
3.2 执行实例化的SoapServer 中的类中的具体方法;
整理出如下的原理图:
可通过该原理图,一步一步的调试问题出在哪里,我们出现上述错误是网络通信的问题。
1)请求的客户端与服务器端是否是通的?----也就是 能否成功生成实例化的soapClient 对象:当客户端与生成soapClient 对象的url-1 相通,只要其他配置正确,该步可成功。
2)请求的客户端与其的soapClient 中的WSDL配置文件(.wsdl)中配置的address 是否是通的。
3)被请求的服务器端 与其生成 SoapServer 的地址是否是通的?----也就是 能否成功生成实例化的SoapServer 对象
PS:判断两者间是否相通的方法:查看Soap配置的是什么协议,当是HTTP协议时,只要在客户端的地址栏中输入另一个的url地址,若能成功访问,则说明两者相通。
我这边最后发现问题出在3)被请求的服务器端 与其生成 SoapServer 的地址不相通,以致于生成 SoapServer 失败。错误便表现出来了,也便报错了如题的错误。