2009-02-26 1 views
1

Я пытаюсь сохранить некоторую пропускную способность и включить файл wsdl в приложение flex/air. Какой формат url следует использовать для загрузки этого файла вместо удаленного.Как загрузить WSDL из файла

Я использую loadWSDL() способ.

EDIT: Файл wsdl должен быть частью приложения. Я знаю, что могу использовать файл: // some/path для локальных файлов, но не знаю, как загрузить файл, который находится внутри самого приложения.

+0

Можете ли вы немного объяснить, какие вы имеете в виду? – dirkgently

ответ

2

Если файл является локальным, просто использовать the file URI scheme:

file://host/path/file.wsdl

Если это не работает, проверьте, если the security sandbox функции блокирует его.

В приложениях AIR для того, чтобы получить доступ к файлам в приложении temporary storage directory или в application's own directory, вам нужно использовать специальные app: или app-storage: схемы URL, хотя.

Как и в случае с dirkgently, вы всегда можете вставить файл в приложение, но, насколько я знаю, вы не сможете впоследствии его модифицировать постоянным образом, поскольку это не просто файл в файловой системе. Вероятно, лучшим вариантом для вас является встраивание этого файла, и если вам нужно его обновить, попросите приложение сохранить обновленную версию в File.applicationStorageDirectory (которую вы всегда должны сначала проверить, прежде чем использовать встроенную версию по умолчанию.) Хотя у меня нет идея использования встроенных XML-файлов с помощью классов WebService даже возможна.

См. this article для получения информации о том, как вставлять внешние XML-файлы в ваше приложение. Это, как я сделал это:

// 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

+0

Хорошо, теперь я (думаю,) понимаю, что встраивание, но я до сих пор не знаю, как создать webservice, используя это. loadWSDL метод принимает только строковые URL-адреса. – Marko

+0

@hasseg: спасибо за такое замечательное объяснение! Вы просто избили меня до этого;) – dirkgently

1

Файл WSDL должен быть частью заявки.

Вы пробовали внедрить его в проект Flex/AIR в качестве ресурса? Прочитано this. Например, вы можете загрузить статические изображения, поставляемые с вашим приложением, указав source как:

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

Я не мог узнать, как использовать @Embed из кода. – Marko

+0

Вы используете тег метаданных [Embed]: http://livedocs.adobe.com/flex/3/html/help.html?content=embed_3.html – hasseg

0

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); 

Если кто-то есть идея, чтобы сделать это менее некрасиво, пожалуйста, дайте мне знать.

EDIT: Я только что заметил, отредактированный ответ, так что вместо этого кода было достаточно, чтобы использовать только:

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

Я использую ниже кода в Flash Builder воздуха мобильное приложение и оно работает, может помочь некоторым еще.Я получаю содержимое файла из веб-службы, используя загрузчик url, и записываю его в файл xml в каталоге документа моего приложения.

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

Получить статус веб-сервиса, если он 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 или ваш каталог выбор в соответствии с вашими потребностями, пожалуйста, имейте в виду, что некоторые из путей считываются только для безопасности. если вы хотите записать обратно те файлы, которые вы не сможете, но только для чтения, это хорошая идея разместить там файлы.