1. 程式人生 > >呼叫webservice,出現錯誤:Uncaught SoapFault exception: [HTTP] Error Fetching http headers

呼叫webservice,出現錯誤:Uncaught SoapFault exception: [HTTP] Error Fetching http headers

    在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

    查看了測試程式碼:

    $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 失敗。錯誤便表現出來了,也便報錯了如題的錯誤。