2010-03-29 53 views
10

我想開發一個動態站點在服務器端使用nusoap的業務邏輯(因爲我需要wsdls和PHP SOAP擴展無法生成wsdls)以及客戶端的PHP SOAP擴展。如何擺脫「未捕獲的SoapFault異常:[客戶端]看起來像我們沒有XML文檔...」錯誤

但是,我甚至無法登錄和getRole函數。當我嘗試調用客戶端,我獲得以下消息

Uncaught SoapFault exception: [Client] looks like we got no XML document in [some paths]... 

WSDL並在服務器端存在,而且客戶端不會讀它(當我把錯誤的URL的WSDL,我得到一個錯誤)。

任何人都可以幫忙嗎?

回答

19

看起來您的客戶端接收到一些無效的XML - 無論是WSDL本身還是服務器返回的響應。嘗試調用客戶端,將trace選項設置爲TRUE,並檢查通過__getLastRequest()__getLastResponse()方法發送/接收的實際XML。

8

我剛剛有一個類似的問題;結果我的服務是echo輸出一些調試數據。我刪除了所有的echo行,它工作正常。

4

我有同樣的問題,我用這個解決:

在PHP服務器SOAP文件有BOM編碼UTF8,造成阿帕奇發回BOM標記(3字節)在xml響應之前。

用utf8編碼你的php文件肥皂服務器帶出BOM標記。

伊格納西奧·古鐵雷斯Torrero

1

有些時候,一個BOM可以生成創建該類型的問題的一些額外的字符。

要檢測是否有任何UTF BOM,請參閱此link

+2

雖然這在理論上回答這個問題,這將是最好(HTTP ://meta.stackexchange.com/q/8259),您可以編輯答案以包含解決方案的重要部分,並提供供參考的鏈接。 – 2012-02-10 20:09:10

2

只需使用trim()給你參數。

$objectRequette = trim($_POST['Requette']) ; 
$client = new SoapClient(null, array(
    'location' => 'http://your.php', 
    'uri'=>'your option', 
)); 
$result = $client->__soapCall('Misyka', array("$objectRequettea")); 
2

在我而言,當我隨「?>」標籤後的空白行腳本出現此錯誤。

刪除這些行解決了問題

+0

我的<?php標記之前,通過刪除其中一個包含文件中的某些空白來修復了我的問題。必須錯誤地點擊標籤,並在某個時刻保存該文件。 – 2017-02-01 08:29:54

0

我有辦法解決這個問題。這不是一個漂亮的解決方案,但它的工作原理...

我怎麼不能在我的螳螂服務器做任何改變,我決定這樣做...

首先我沉默的SOAPFault:

try { 
    $client = new SoapClient('http://www.mymantisaddress.com/api/soap/mantisconnect.php?wsdl', array('trace'=> 1, 'exceptions' => 0)); 
    $result = $client->__soapCall($function_name, $args); 
} catch (SoapFault $e) { 
    //$result = array(
    // 'erro' => $e->faultstring 
    //); 
} 

其次,我注意到有這三傾斜控制焦炭在開始我的字符串,所以我刪除它:

$str = substr($client->__getLastResponse(), 3) . "pe>"; 
print $str; 

第三,我必須在我的字符串的末尾加上「pe>」,因爲它不完整。

2

不要忘記使用try/catch塊:

try { 
    var_dump($client->foo()); 
} catch (Exception $e) { 
    echo($client->__getLastResponse()); 
    echo PHP_EOL; 
    echo($client->__getLastRequest()); 
} 
0

以下可能是問題的一些用戶。因爲我已經通過了它。

對於最新的NuSOAP版本,下面將解決你的問題:

找到下面的代碼在nusoap.php

$this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); 

符合6132或東西解決這個沒有。

和評論的IT

// $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); 

因爲它只是用於調試的目的。所以不用擔心任何功能問題。

1

我有同樣的問題。我的問題通過在php.ini上設置always_populate_raw_post_data-1解決。

我發現這個通過添加「跟蹤」 => 1,「例外」 => 1在選擇和使用try catch並獲得__getLastRequest()__getLastResponse()

+1

請注意,自PHP 7.0.0以來,always_populate_raw_post_data已被刪除 – 2016-10-24 13:30:30

相關問題