在不使用wsdl文件的情况下调用webservice

时间:2012-10-30 14:31:45

标签: actionscript-3 soap

我需要打电话给网络服务,目前我这样做:

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文件并直接将soapcalls发送到正确的URL。这可能吗?

1 个答案:

答案 0 :(得分:0)

是的,当我们的WS调用必须在DMZ中访问代理时,我必须这样做,但是ACTUAL服务的WSDL是在防火墙后面并且无法访问。但这是一个棘手的过程。

首先,您需要手动创建soap post请求。您可以在维基百科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”),它将返回准备去的SOAP信封,你将用它作为你的呼叫的POST主体。请注意,在示例中,您必须提前知道WSDL中提供的信息,如方法名称,参数名称等。使用Socket()类将post body发送到服务器,因为您需要添加自定义SOAPAction标头。如果您需要有关该部分的帮助,这里有一个开始黑客攻击的类已经做到了...使用它代替HTTPService。 RestHTTPService