如何从文件加载WSDL

问题描述:

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

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

+0

你能解释一下你脑海中的选择吗? – dirkgently 2009-02-26 12:40:37

如果该文件是本地的,只要使用the file URI scheme

file://host/path/file.wsdl

如果不工作,检查是否the security sandbox功能阻止它。

在AIR应用程序,以访问应用程序的temporary storage directoryapplication's own directory文件,你需要使用特殊的app:app-storage: URL方案,虽然。

就像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()); 
+0

查看问题编辑评论。 – Marko 2009-02-26 12:58:42

+0

好吧,现在我(想)了解嵌入,但我仍然不知道如何使用此创建web服务。 loadWSDL方法只接受字符串url。 – Marko 2009-02-26 14:56:24

WSDL文件需要应用程序的一部分。

您是否试图将其作为资源嵌入到Flex/AIR项目中?阅读this。例如,您可以通过指定source负载随您的应用程序的静态图像:

source="@Embed(source='relativeOrAbsolutePath')" 

UF,这是丑陋的,所以我回答的参考。感谢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'); 

我用下面Flash Builder中的空气移动应用程序代码和它的作品,可以帮助一些人。我使用url加载程序从web服务获取文件内容,并将其下载到我的空中应用程序的文档目录中的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);

,并在事件侦听

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或应用程序了或您选择的目录根据自己的需要,请记住,某些路径都只是出于安全读取。如果你想写回这些文件,你将无法做到,但仅仅为了阅读目的,将文件放在那里是个好主意。