Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работаем с вКонтакте API (http://www.flasher.ru/forum/showthread.php?t=125954)

Drabuna 05.06.2009 20:38

Работаем с вКонтакте API
 
Делаю класс для работы с АПИ

Код AS3:

package
{
        public class API
        {
                import MD5;
                import flash.net.*;
                import flash.xml.*;
                import flash.events.*;
                var API_SERVER_URL:String="http://api.vkontakte.ru/api.php";
                var API_METHOD:String;
                var API_SIG:String;
                var API_SECRET:String;
                var API_V:String;
                var API_TEST_MODE:Number;
                var VIEWER_ID:String;
                var API_ID:String;
                var my_request:URLRequest;
                public var my_loader:URLLoader= new URLLoader();
                var my_vars:URLVariables;
                var myXml:XML;
 
 
                public function API(api_id:String, api_secret:String, viewer_id:String, api_v:String, api_test_mode:Number)
                {
                        API_ID=api_id;
                        API_SECRET=api_secret;
                        VIEWER_ID=viewer_id;
                        API_V=api_v;
                        API_TEST_MODE=api_test_mode;
                }
 
                public function send_request(method:String):XML
                {
                        my_request= new URLRequest(API_SERVER_URL);
                        my_loader.addEventListener(Event.COMPLETE, checkComplete);
                        my_vars = new URLVariables();
                        my_request.method = URLRequestMethod.POST;
                        my_loader.dataFormat=URLLoaderDataFormat.TEXT;
                        API_METHOD=method;
                        API_SIG=MD5.hash(VIEWER_ID+"api_id="+API_ID+"method="+API_METHOD+"test_mode="+API_TEST_MODE+"v="+API_V+API_SECRET);
                        my_vars.api_id=API_ID;
                        my_vars.method=API_METHOD;
                        my_vars.sig=API_SIG;
                        my_vars.v=API_V;
                        my_vars.test_mode=API_TEST_MODE;
                        my_request.data = my_vars;
                        my_loader.load(my_request);
                        return myXml;
                }
 
 
                public function checkComplete(event:Event):void
                {
                        var loader:URLLoader = URLLoader(event.target);
                        myXml=new XML(loader.data);
                }
 
        }
}

Вот и кусок кода из проджекта:
Код AS3:

import API;
 
var API_ID:String=String(LoaderInfo(root.loaderInfo).parameters.api_id);
var viewer_id:String= String(LoaderInfo(root.loaderInfo).parameters.viewer_id);
var myXML:XML=new XML();
var API_SECRET:String="SECRET";
 
btn1.addEventListener(MouseEvent.CLICK, onClick);
 
var api_control:API=new API(API_ID, API_SECRET, viewer_id, "2.0", 1);
 
function onClick(event:MouseEvent):void
{
        output.appendText(api_control.send_request("getFriends"));
}

Смотрел примеры и искал исходники, но большинство на втором екшн скрипте.
Учу для себя, потому что интересно)
Вот. К описанию проблемы. Насколько я понимаю, когда я вызываю send_request, он сразу возвращает XML, не дождавшись завершения загрузки. Тоесть нужные мне данные я получаю только при втором нажатии на кнопку. Помогите сделать так чтобы ХМЛ возвращался тогда когда уже загрузка завершенна. Спасибо)

etc 05.06.2009 21:27

Использовать событийную модель.

Drabuna 05.06.2009 21:43

Эээ... а можно пример какой то или ссылку?)

Добавлено через 2 часа 57 минут
ау! тут кто то есть?)

etc 06.06.2009 12:25

Откройте доку по EventDispatcher.

Котяра 06.06.2009 12:38

Код AS3:

send_request(method:String):XML

не должен возвращать XML, лучше сделать
Код AS3:

send_request(method:String, onXMLDadaListiner:Function):void


etc 06.06.2009 12:42

Котяра, а как извне убить обработчик onXMLDataListener?

Котяра 06.06.2009 12:55

а его можно и не делать)
Код AS3:

package
 
                private var _onXMLDadaListiner:Function
                public function send_request(method:String, onXMLDadaListiner:Function):void
                {
 
                      _onXMLDadaListiner=onXMLDadaListiner;
                        my_request= new URLRequest(API_SERVER_URL);
                        my_loader.addEventListener(Event.COMPLETE, checkComplete);
                        my_vars = new URLVariables();
                        my_request.method = URLRequestMethod.POST;
                        my_loader.dataFormat=URLLoaderDataFormat.TEXT;
 
                        my_loader.load(my_request);
 
                }
 
 
                public function checkComplete(event:Event):void
                {
                        my_loader.removeEventListener(Event.COMPLETE, checkComplete);
                          _onXMLDadaListiner( event.target.data)
                }
 
        }
}

Изврат, но близко

etc 06.06.2009 12:58

Я понимаю, что можно не делать. Как уничтожить API, после того, как он становится ненужным?

Котяра 06.06.2009 13:19

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

etc 06.06.2009 13:42

А события-то чем не устроили?


Часовой пояс GMT +4, время: 22:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.