2012-08-05 59 views
2

美好的一天,讀者。Php Soap Server檢索vb WinHttp.WinHttpRequest

我的任務是構建一個PHP SOAP服務器來接收由VB客戶端通過WinHttp.WinHttpRequest對象發送的xml。我正在使用PHP服務器的nuSoap,它到目前爲止還沒有工作。

vb客戶端發送的xml包含需要與其他nessecary變量一起使用的已定義的webservice,這就是爲什麼沒有在vb代碼中植入soapaction的東西。 '他們' 要這樣說:'(

SOAP服務器併發送到VB這樣的迴應:

<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP- 
ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> 
     <faultactor xsi:type="xsd:string"></faultactor> 
     <faultstring xsi:type="xsd:string">Operation &apos;&apos; is not defined in the WSDL for this service</faultstring> 
     <detail xsi:type="xsd:string"></detail> 
    </SOAP-ENV:Fault> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

VB的客戶端發送的XML:

Private Sub Command2_Click() 
mydata = "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf 
    mydata = mydata & "<root>" & vbCrLf 
mydata = mydata & "<SERVICE>SayHello</SERVICE>" & vbCrLf 
mydata = mydata & "<NAME>Noobula</NAME>" & vbCrLf 
mydata = mydata & "</root>" & vbCrLf 
    Set w = CreateObject("WinHttp.WinHttpRequest.5.1") 
     w.Open "POST", "http://127.0.0.1:80/soapvb/terimaxml.php" 
     w.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
     w.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = 13056 
     w.Send mydata 
     respo = w.ResponseText 
     Text1 = respo 
End Sub 

而且最後,服務器本身:

require_once "lib/nusoap.php"; 
$debug = 0; 
$server = new soap_server(); 
$server->configureWSDL('terimaxml', 'urn:terimaxml'); 

function SayHello($xml){ 
    //messing with xml taking NAME and say Olaa 
    echo "Olaaa :D"; 
} 

$server->register('SayHello()', 
        array('xml' =>'xsd:array'), 
        'urn: terimaxml', 
        'urn: terimaxml#__construct()', 
        'rpc', 
        'encoded', 
        '-----' 
       ); 

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) 
? $HTTP_RAW_POST_DATA : ''; 
$server->service($HTTP_RAW_POST_DATA); 

我一直在互聯網上漫遊一段時間t o解決這個問題。所以任何幫助將不勝感激,在此先感謝。 :d

回答

0

操作' '沒有在WSDL定義此服務

這是因爲

$HTTP_RAW_POST_DATA : ''; 

該操作&者意味着你的數據解析,以與禁止撇號值XML XML。

,並嘗試改變這一切撇號用雙引號(「)

$server->register("SayHello()", 
        array("xml" =>"xsd:array"), 
        "urn: terimaxml", 
        "urn: terimaxml#__construct()", 
        "rpc", 
        "encoded", 
        "-----" 
       ); 

糾正我,如果我錯了。

^^

+0

嗨,我也遇到這個錯誤,,但它仍然不起作用:S – Errorhere 2015-10-27 03:51:58

0

我不知道,如果這裏的代碼是故意爲清晰起見,但我想我會看到三個問題。

首先,->register中的函數名稱不應包含()

$server->register("SayHello", 
    array("xml" =>"xsd:array"), 
    "urn: terimaxml", 
    "urn: terimaxml#__construct()", 
    "rpc", 
    "encoded", 
    "-----" 
); 

其次,我認爲$HTTP_RAW_POST_DATA被錯誤命名的,這樣的話你要發送一個空變量的函數。

$HTTP_RAW_POST_DATA = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? 
$GLOBALS["HTTP_RAW_POST_DATA"] : ""; 

可選第三,HTTP_RAW_POST_DATA有利於超級全局數組$_POST被棄用。

$server->service(http_build_query($_POST)); 

我不確定,我剛剛在兩個月前開始使用nusoap,但這些是我的代碼和你的代碼之間的差異。一次嘗試一個,看看他們是否有所幫助。