0

我需要调用网络服务,目前我正在这样做:

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。这可能吗?

4

1 回答 1

0

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

首先,您需要手动创建soap post 请求。您可以在 wikipedia http://en.wikipedia.org/wiki/SOAP上阅读有关该结构的所有信息。这意味着您将需要手动生成所有调用,因为您不能在没有加载 wsdl 的情况下说 SomeService.SomeMethod。现在,您将面临的下一个问题实际上是将其发送出去。因为您需要在 POST 上添加自定义 http 标头,所以您需要构建完整的请求文档(字符串和换行符等)并通过套接字发送(HTTPService 不支持 POST 上的自定义标头)。如果您需要更多帮助来完成这项工作,我可以在此处添加更多示例。

例子:

您基本上需要创建一个方法来生成 SOAP 信封。这是我给你的链接中的一个快速ie......

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() 类将帖子正文发送到服务器,因为您需要添加自定义 SOAPAction 标头。如果你需要这部分的帮助,这里有一个类开始破解它已经做到了......使用它而不是 HTTPService。 休息HTTP服务

于 2012-10-31T01:41:03.093 回答