Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.11.2013, 17:57
razerw вне форума Посмотреть профиль Отправить личное сообщение для razerw Найти все сообщения от razerw
  № 1  
Ответить с цитированием
razerw

Регистрация: Jun 2012
Адрес: Татарстан
Сообщений: 118
По умолчанию APIConnection не срабатывают события

APIConnection не срабатывают события об отработке запроса или ошибки.
То есть я отрабатываю запрос VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError); в котором я хочу узнать фио и пол, но никакого события не происходит. Помогите пожалуйста разобраться.

Код AS3:
package vk {
 
	import flash.display.*;
    import flash.events.*;
    import vk.APIConnection;
    import vk.events.*;
    import vk.ui.VKButton;
	import vk.events.CustomEvent;
 
	public class VkAPI
	{
		// получаем flashVars
		//public static var flashVars:Object;
		//public static var VK:APIConnection;
		public static var api_id:Number;
        public static var viewer_id:Number;
        public static var sid:String;
        public static var secret:String;
		//private
		private static var idUserVk:*;
		private static var idUserVk2:*;
 
		public function VkAPI() 
		{
 
		}
 
		//Узнаём ИД пользователя, ФИО, секретный код, ИД сессии.
		public static function vkId(param1:String)
		{
			var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
 
		    // присваиваем переменным значения из flashVars ЭТИ МЕТОДЫ ОТРАБАТЫВАЮТ
            api_id = flashVars['api_id'];
            viewer_id = flashVars['viewer_id'];
            sid = flashVars['sid'];
            secret = flashVars['secret'];
			var VK:APIConnection = new APIConnection(flashVars);
			VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError);// запрос отправляется но в ответ ничего не приходит
 
			return idUserVk2;
 
		}
 
		private static function onProfileLoaded(data:Object)
		{
            idUserVk2 = data[0]['uid'];
 
		}
 
		private static function onError(data:Object):void
		{
			idUserVk2 = data.first_name;
			//trace(data.error_msg);
		}
 
	}
 
}

Старый 19.11.2013, 18:19
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
Что такое индекс? У вас вообще ерунда написана какая то. Вечером выложу нормальный вид запроса, ждите

Добавлено через 2 часа 3 минуты
Код AS3:
package outcomebet.controllers 
{
	import com.in4core.utils.logger.I4Logger;
	import flash.display.DisplayObjectContainer;
	import outcomebet.events.PlayerModelEvents;
	import outcomebet.models.BaseModel;
	import outcomebet.views.BaseView;
	/**
	 * ...
	 * @author in4core progression lab
	 */
	public final class BaseController extends Object 
	{
		private var _host:DisplayObjectContainer 	= null;
		private var _baseModel:BaseModel 			= new BaseModel();
		private var _baseView:BaseView 				= new BaseView();
 
		private var _vkWrapper:VKWrapper			= new VKWrapper();
 
		public function BaseController(host:DisplayObjectContainer) 
		{
			_host = host;
		}
 
		public function init():void
		{
			_vkWrapper.createAPI();
			_vkWrapper.vkconnection.api("friends.get", _vkWrapper.getStandardFields(), onUsersInitialize, onVKCallBackError);
		}
 
		private function onVKCallBackError(o:Object):void 
		{
			trace("4:VK api call back error");
		}
 
		private function onUsersInitialize(o:Object):void 
		{
			_baseModel.friendsModel.fillFriends( o as Array );
			_baseModel.friendsModel.addEventListener(PlayerModelEvents.ALL_FRIENDS_PHOTOS_LOADED , onAllFriendsPhotosLoaded);
		}
 
		private function onAllFriendsPhotosLoaded(e:PlayerModelEvents):void 
		{
			_vkWrapper.vkconnection.api("users.get", _vkWrapper.getStandardFields(), onClinetInitialize, onVKCallBackError);
		}
 
		private function onClinetInitialize(o:Object):void 
		{
			var obj:Object = o[0] as Object;
 
			_baseModel.playerModel.addEventListener(PlayerModelEvents.USER_PHOTO_LOADED , onClientPhotoLoaded);
			_baseModel.playerModel.fillFields(obj);
		}
 
		private function onClientPhotoLoaded(e:PlayerModelEvents):void 
		{
			I4Logger.print("App Ready!" , 0xFF0000);
 
			_baseView.baseModel = _baseModel;
			_host.addChild(_baseView);
		}
 
	}
 
}
Код AS3:
package outcomebet.controllers 
{
	import flash.errors.IllegalOperationError;
	import flash.events.EventDispatcher;
	import vk.APIConnection;
 
	/**
	 * ...
	 * @author in4core progression lab
	 */
	public final class VKWrapper extends EventDispatcher 
	{
		private var _vkconnection:APIConnection;
 
		public static var flashVars:Object = null;
 
		public function VKWrapper() 
		{
 
		}
 
		public function createAPI():void
		{
			if (flashVars) _vkconnection = new APIConnection(flashVars);
			else throw new IllegalOperationError("FV - null");
		}
 
		public function get vkconnection():APIConnection 
		{
			return _vkconnection;
		}
 
		public function getStandardFields(id:uint = 0):Object
		{
			if (!id) id = flashVars["viewer_id"];
 
			return { user_ids : id , fields : "nickname, screen_name, photo_100" };
		}
 
 
 
	}
 
}
Код AS3:
package 
{
	import com.in4core.utils.logger.I4Logger;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.system.Security;
	import outcomebet.controllers.BaseController;
	import outcomebet.controllers.VKWrapper;
	import vk.APIConnection;
 
	/**
	 * ...
	 * @author in4core progression lab
	 */
	[Frame(factoryClass="Preloader")]
 
	public class Main extends Sprite 
	{
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			Security.loadPolicyFile("http://vk.com/crossdomain.xml");
 
			var flashVars:Object = stage.loaderInfo.parameters as Object; 
 
			if (!flashVars.api_id)
			{
				flashVars['api_id'] = 1; 
				flashVars['viewer_id'] =  1; 
				flashVars['sid'] = "XXX"
				flashVars['secret'] =  "XXX"; 
			}
 
 
			VKWrapper.flashVars = flashVars;
 
			I4Logger.print(flashVars);
 
			var base:BaseController = new BaseController(this);
			base.init();
		}
 
	}
Работатть будет) Тут много лишнего, того, что вам не надо, но думаю разберетесь
__________________
Марк Tween

Старый 20.11.2013, 10:00
razerw вне форума Посмотреть профиль Отправить личное сообщение для razerw Найти все сообщения от razerw
  № 3  
Ответить с цитированием
razerw

Регистрация: Jun 2012
Адрес: Татарстан
Сообщений: 118
Спасибо за пример. Я понял что этот скрипт получает данные только при старте флешке, получает и дальше продолжает отрабатывать другие методы. Но что делать если мне надо например прям в середине игры запросить и узнать какие то данные, то есть выполнить запрос _vkWrapper.vkconnection.api(); Как бы это могло выглядеть?

Добавлено через 9 минут
Цитата:
Сообщение от in4core Посмотреть сообщение
Что такое индекс? У вас вообще ерунда написана какая то. Вечером выложу нормальный вид запроса, ждите
Индекс это ссылка на сцену, идет из главного класса как статическая переменная.

Старый 20.11.2013, 12:11
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Точно так же и выглядело бы. Вид посылает запрос контроллеру, контроллер запускает _vkWrapper. Все предельно просто
__________________
Марк Tween

Старый 20.11.2013, 12:52
razerw вне форума Посмотреть профиль Отправить личное сообщение для razerw Найти все сообщения от razerw
  № 5  
Ответить с цитированием
razerw

Регистрация: Jun 2012
Адрес: Татарстан
Сообщений: 118
Цитата:
Сообщение от in4core Посмотреть сообщение
Точно так же и выглядело бы. Вид посылает запрос контроллеру, контроллер запускает _vkWrapper. Все предельно просто
кто такой Вид? получается если из любого класса то метод init в классе BaseController должен быть статическим?

Старый 20.11.2013, 13:01
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Цитата:
Сообщение от razerw Посмотреть сообщение
кто такой Вид? получается если из любого класса то метод init в классе BaseController должен быть статическим?
Вид – это какое-то творчество внутри BaseView, вестимо. Вы бы лучше зажмурили глаза и не смотрели на то, что Вам скинули – у него там ерунда какая-то

А Вы откуда тестируете? У меня предчувствие, что вся проблема из за того, что flashVars пустые (запуск локально).

Старый 20.11.2013, 13:45
razerw вне форума Посмотреть профиль Отправить личное сообщение для razerw Найти все сообщения от razerw
  № 7  
Ответить с цитированием
razerw

Регистрация: Jun 2012
Адрес: Татарстан
Сообщений: 118
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Вид – это какое-то творчество внутри BaseView, вестимо. Вы бы лучше зажмурили глаза и не смотрели на то, что Вам скинули – у него там ерунда какая-то

А Вы откуда тестируете? У меня предчувствие, что вся проблема из за того, что flashVars пустые (запуск локально).
я тестирую прям в самом вк, компилирую на компе получаю сообщение
{"error":{"error_code":101,"error_msg":"Invalid application API ID","request_params":[{"key":"format","value":"JSON"},{"key":"user_ids","value":"0"},{"key":"sig","value":"7eb76717bb32f434357cd95b316c7b9f"},{"key":"fields","value":"nickn ame, screen_name, photo_100"},{"key":"sid","value":"null"},{"key":"method","value":"users.get"},{"key":"api_id","value":"NaN"},{"key":"v","value":"3.0"}]}}

это же сообщение получаю если даже сделать так, и компилировать
Код AS3:
flashVars['api_id'] = 1728947;
            flashVars['viewer_id'] = 1306422;
            flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301';
            flashVars['secret'] = '7ef8l6a4p8';


flashVars работает и присылает все данные, только что проверил вижу ид, секретный код и дт

Добавлено через 1 минуту
в статистике по приложению в АПИ вижу, что запросы в количестве 56 штук поступали к users.get

Добавлено через 2 часа 28 минут
Я нашел в чем причина, в моём коде
Код AS3:
package vk {
 
	import flash.display.*;
    import flash.events.*;
    import vk.APIConnection;
    import vk.events.*;
    import vk.ui.VKButton;
	import vk.events.CustomEvent;
 
	public class VkAPI
	{
		// получаем flashVars
		//public static var flashVars:Object;
		//public static var VK:APIConnection;
		public static var api_id:Number;
        public static var viewer_id:Number;
        public static var sid:String;
        public static var secret:String;
		//private
		private static var idUserVk:*;
		private static var idUserVk2:*;
 
		public function VkAPI() 
		{
 
		}
 
		//Узнаём ИД пользователя, ФИО, секретный код, ИД сессии.
		public static function vkId(param1:String)
		{
			var flashVars:Object = Index.stage.loaderInfo.parameters as Object;
 
		    // присваиваем переменным значения из flashVars ЭТИ МЕТОДЫ ОТРАБАТЫВАЮТ
            api_id = flashVars['api_id'];
            viewer_id = flashVars['viewer_id'];
            sid = flashVars['sid'];
            secret = flashVars['secret'];
			var VK:APIConnection = new APIConnection(flashVars);
			VK.api('users.get', { user_ids:1, fields:'city,sex' }, onProfileLoaded, onError);
 
			return idUserVk2; // Приходит ундифенд 
 
		}
 
		private static function onProfileLoaded(data:Object)
		{
            idUserVk2 = data[0]['uid']; // и только потом сюда попадают данные
 
		}
 
		private static function onError(data:Object):void
		{
			idUserVk2 = data.first_name;
			//trace(data.error_msg);
		}
 
	}
 
}


Последний раз редактировалось razerw; 20.11.2013 в 16:13.
Старый 21.11.2013, 02:36
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 8  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
Код AS3:
_vkWrapper.vkconnection.api(
Вот это вообще наповал. Враппер для враппера.
Их (Вк-шные) классы из коробки уже сами по себе - враппер.

По теме - научитесь разделять овец и баранов в коде.
ID сессии ВК получается из GET параметров, которые передаются флешке параметрами.
Код AS3:
stage.loaderInfo.parameters // Object
В зависимости от того, настроен ли у вас в приложении первый запрос к API - в эти параметры будет включен так же и результат запроса.

В коде, который вы привели в самом начале - параметр
Код AS3:
idUserVk
в момент вызова
Код AS3:
return idUserVk
будет скорее всего null или undefined.
Вы отправляете к ВК серверу запрос на получение данных. И в этом же кадре обращаетесь к переменной, которая должна быть определена только после ответа сервера ВК.
Вам следует вникнуть в азы работы клиент-серверных приложений. И только потом уже разбираться с API.

Старый 21.11.2013, 08:54
razerw вне форума Посмотреть профиль Отправить личное сообщение для razerw Найти все сообщения от razerw
  № 9  
Ответить с цитированием
razerw

Регистрация: Jun 2012
Адрес: Татарстан
Сообщений: 118
Цитата:
Сообщение от Frost47rus Посмотреть сообщение
Код AS3:
_vkWrapper.vkconnection.api(
Вот это вообще наповал. Враппер для враппера.
Их (Вк-шные) классы из коробки уже сами по себе - враппер.

По теме - научитесь разделять овец и баранов в коде.
ID сессии ВК получается из GET параметров, которые передаются флешке параметрами.
Код AS3:
stage.loaderInfo.parameters // Object
В зависимости от того, настроен ли у вас в приложении первый запрос к API - в эти параметры будет включен так же и результат запроса.

В коде, который вы привели в самом начале - параметр
Код AS3:
idUserVk
в момент вызова
Код AS3:
return idUserVk
будет скорее всего null или undefined.
Вы отправляете к ВК серверу запрос на получение данных. И в этом же кадре обращаетесь к переменной, которая должна быть определена только после ответа сервера ВК.
Вам следует вникнуть в азы работы клиент-серверных приложений. И только потом уже разбираться с API.
Совершенно верно вы подметили при ходит undefined потому что отправляю запрос и тут же return idUserVk
Подскажите пожалуйста как можно реализовать получение ответа после получения ответа от апи вк?

Старый 21.11.2013, 11:14
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 10  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Подскажите пожалуйста как можно реализовать получение ответа после получения ответа от апи вк?
Посылать свое событие по приходу ответа от вк, и в нужном месте слушать это событие.

Но, имхо, с колбэками гораздо удобнее. У меня вообще библиотека работы с вк и одноклассниками работает только через статические методы. Что-то типа
Код AS3:
Social.getFriendList(onSuccess, onError);
Просто передаем туда ссылки на методы-колбэки, и один из них вызывается при получении ответа от вк или одноклассников. После чего ссылки на оба метода обнуляются. Не нужно никаких лишних подписок на события, все довольно удобно.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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