2012-10-30 67 views
0

我需要調用一個Web服務,並在此刻我做這種方式:調用Web服務,而無需使用WSDL文件

private var myWebService:WebService = new WebService(); 
myWebService.loadWSDL('path to wsdl file'); 

myWebService.addEventListener(ResultEvent.RESULT , function(event:ResultEvent):void { 
    trace(event); 
}); 
myWebService.addEventListener(FaultEvent.FAULT , function(event:FaultEvent):void { 
    trace(event); 
}); 

myWebService.soapcallName(); 

現在我想這樣做同樣的事情,但沒有加載WSDL文件並直接將soap調用到正確的url。這可能嗎?

回答

0

是的,當我們的WS調用必須在DMZ中創建代理時,我必須這樣做,但ACTUAL服務的WSDL位於防火牆之後並且無法訪問。但這是一個棘手的過程。

首先,您需要手動創建soap帖子請求。你可以閱讀所有關於維基百科http://en.wikipedia.org/wiki/SOAP的結構。這意味着您將需要手動生成所有調用,因爲您不能說沒有加載wsdl的SomeService.SomeMethod。現在,你將面臨的下一個問題實際上是將它發送出去。因爲您需要在POST上添加自定義http標頭,所以您需要構建完整的請求文檔(字符串和換行符等)並通過套接字發送(HTTPService不支持POST上的自定義標頭)。如果您需要更多幫助,請在此處添加更多示例。

示例:

您需要基本上創建一個方法來生成SOAP信封。下面是我給你的鏈接快速即...

private function getStockPrice(symbol:String):String{ 
    // you can do this with xml also and call toString() on it later 
    var envelope:String = "<?xml version=\"1.0\"?>"; 
    envelope += "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">"; 
    envelope += "<soap:Header></soap:Header>"; 
    envelope += "<soap:Body><m:GetStockPrice xmlns:m=\"http://www.example.org/stock\">"; 
    envelope += "<m:StockName>" + symbol + "</m:StockName>"; 
    envelope += "</m:GetStockPrice></soap:Body></soap:Envelope>"; 
    return envelope; 
} 

然後調用getStockPrice(「IBM」),這將返回準備去,你會爲你的電話的POST體使用SOAP信封。請注意,在本例中,您將必須提前知道WSDL中的信息,例如方法名稱,參數名稱等。使用Socket()類將郵件正文發送到服務器,因爲您需要添加一個自定義的SOAPAction頭。如果你需要那個部分的幫助,這裏有一個開始黑客攻擊的課程,那就是用它來代替HTTPService。 RestHTTPService

+0

我很樂意看到一個例子,如果可能的話。我對肥皂很陌生,任何幫助都很有用。 – vincent

+0

只是在編輯中添加了這個例子。 –