如何从文件加载WSDL

时间:2009-02-26 12:33:00

标签: flex web-services actionscript air

我正在尝试节省一些带宽并在我的flex / air应用程序中包含wsdl文件。我应该使用哪种url格式来加载该文件而不是远程文件。

我正在使用 loadWSDL ()方法。

编辑: wsdl文件需要成为应用程序的一部分。我知道我可以使用file:// some / path作为本地文件,但不知道如何加载应用程序内部的文件。

4 个答案:

答案 0 :(得分:2)

如果文件是本地文件,请使用the file URI scheme

file://host/path/file.wsdl

如果这不起作用,请检查the security sandbox功能是否阻止它。

在AIR应用中,为了访问应用程序temporary storage directoryapplication's own directory中的文件,您需要使用特殊的app:app-storage:网址方案。< / p>

就像dirkgently说的那样,你总是可以将文件嵌入到应用程序中,但据我所知,之后你将无法以持久的方式修改它,因为它不仅仅是文件系统中的文件。对您来说,最好的选择可能就是嵌入此文件,如果您以后需要更新它,请让应用程序将更新后的版本保存到File.applicationStorageDirectory中(在使用默认嵌入版本之前,您需要先检查它)。虽然我不知道是否可以使用带有WebService类的嵌入式XML文件。

有关如何将外部XML文件嵌入应用程序的信息,请参阅this article。这就是我做到的:

// note: common sense says that the mimeType should be "text/xml" here but
// it doesn't work -- this does, though. who knows why.
[Embed(source="File.xml", mimeType="application/octet-stream")]
private const _fileXMLClass:Class;
private var _fileXML:XML = XML(new _fileXMLClass());

答案 1 :(得分:1)

  

wsdl文件需要成为应用程序的一部分。

您是否尝试将其作为资源嵌入Flex / AIR项目中?阅读this。例如,您可以通过将source指定为:

来加载随应用附带的静态图片
source="@Embed(source='relativeOrAbsolutePath')"

答案 2 :(得分:0)

是的,这很难看,所以我正在回答这个问题。感谢您对hasseg和dirkgently的见解

这是代码。

首先,声明变量:

[Embed(source="/ws/wsdl/LoginService.wsdl", 
       mimeType="application/octet-stream")]
private const _fileXMLClass:Class;
private var _fileXML:XML = XML(new _fileXMLClass());

然后,加载wsdl:

var file : File = dir.resolvePath(name + ".xml");
var stream : FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeUTFBytes(getWsdl().toXMLString());
stream.close();
loadWSDL(file.url);

如果有人想让这件事变得不那么难看,请告诉我。

编辑:我刚刚注意到编辑过的答案,所以不用这个代码就足以使用:

loadWSDL('app:///path/to/my/file.wsdl');

答案 3 :(得分:0)

我在flash builder air mobile app中使用以下代码并且它可以工作,可能会帮助其他人。我使用url loader从Web服务获取文件内容,并将其转换为我的air app的文档目录中的xml文件。

var url:URLRequest = new URLRequest(Globals.deviceSettings.endpoint);
                loader.load(url);
                loader.addEventListener(Event.COMPLETE, loaderComplete);

获取Web服务的状态,如果它是200然后可用并抬头。 loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, ldrStatus);

并在eventlistener中

function loaderComplete(e:Event):void
            {

                    var f:File= File.documentsDirectory.resolvePath("source/category.xml");
                    var _xml:XML = new XML(loader.data);
                    var fs:FileStream = new FileStream();
                    fs.open(f, FileMode.WRITE);
                    fs.writeUTFBytes(_xml.toXMLString());
                    fs.close();
                    popup.close(true);
                    var popup:MyPopupComponent = new MyPopupComponent();
                    popup.show("Successfully updated from the server",this);
                    popup.close();
            }

您可以根据需要使用file.documentdirectory或applicaiton或您的选择目录,请记住,某些路径仅为安全性而读取。如果你想回写那些你不能写的文件,但只是为了阅读目的,最好把文件放在那里。