2014-11-24 134 views
0

我想是這樣的:如何通過PHP中的SOAP訪問Web服務?

try{ 

    $opts = array(
     'http'=>array(
      'user_agent' => 'PHPSoapClient' 
      ) 
     ); 

    $context = stream_context_create($opts); 
    $client = new SoapClient('http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl', 
          array('stream_context' => $context, 
            'cache_wsdl' => WSDL_CACHE_NONE)); 

          )); 
    print_r($client); 
} 
catch(Exception $e){ 
    echo $e->getMessage(); 
} 

和我的var_dump函數的結果是: SOAP的錯誤:解析WSDL:無法從加載....無法加載外部實體...

我怎樣才能通過肥皂訪問Web服務?謝謝。

這是XML的開頭:enter image description here

+0

any?任何想法都歡迎:) – 2014-11-24 09:56:30

+0

我不認爲你需要用戶代理和上下文。看起來您無法讀取WSDL,因爲它受到基本身份驗證的保護。看到我的答案的第二部分解決方案 – Konstantin 2014-11-24 10:27:32

+0

我從另一篇文章看到,我必須從php.ini啓用extension = php_openssl.dll。我不得不提到它從一開始就啓用了 – 2014-11-25 07:21:26

回答

0

首先:你提供所需的基本身份驗證 URL。在使用HTTP基本認證時,PHP只會在調用服務時發送憑證,而不是在獲取WSDL時發送憑證。

You CAN get a wsdl, if basic authentication is required

$login = 'xxx'; 
$password = 'xxx'; 

$client = new SoapClient(
    'http://' . urlencode($login) . ':' . urlencode($password) . '@83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl', 
    array(
     'login' => $login, 
     'password' => $password 
    ) 
); 

其次: 你的回報XML並不像有效的WSDL文件。請閱讀SoapClient documentation page以瞭解正確的用法 - 對於非WSDL使用,new SoapClient()的第一個參數必須是WSDL文件的URI或null。 (這是一個example of WSDL file)可能需要在非WSDL模式下創建SoapClient?

+0

我更新了我的帖子。我認爲這是鏈接:http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl。這個返回有效的WSDL – 2014-11-24 10:17:55

+0

請再次檢查我的帖子 – 2014-11-24 10:19:56

+0

我用完全你的代碼,我只是改變了密碼和登錄,但我仍然得到此消息「致命錯誤:未捕獲SoapFault異常:[WSDL] SOAP錯誤:解析WSDL:」。 Thx幫助我,我真的Apping它它 – 2014-11-25 07:15:53

0

我剛剛從83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem?wsdl下載了該文件。我保存在wsdl格式,現在我得到的功能

$client = new SoapClient("WebItem.wsdl", array('proxy_host'  => "83.166.204.26", 
              'proxy_port'  => 7147, 
              'proxy_login' => "xxxxxx", 
              'proxy_password' => "xxxxxxxx")); 
echo "<pre>"; var_dump($client->__getFunctions()); echo "</pre>";