Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Взаимодействие с API ВКонтакте. (http://www.flasher.ru/forum/showthread.php?t=185905)

soundy_flash 23.10.2012 22:20

Взаимодействие с API ВКонтакте. Обработка JSON-ответов.
 
Здравствуйте, коллеги.

Ради интереса, решил изучить ВКонтакте API, но достаточно быстро застопорился.

Приведу код, а дальше объясню, в чём проблема:

Код AS3:

package vkApiTest
{
        import flash.display.JointStyle;
        import flash.display.Sprite;
        import flash.events.*;
        import flash.text.*;
 
        import vk.APIConnection;
 
        public class Main extends Sprite
        {
                private var tF:TextField = new TextField();
 
                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);
                        // entry point
                        var flashVars:Object = stage.loaderInfo.parameters as Object;
                        var VK:APIConnection = new APIConnection(flashVars);
 
                        if (!flashVars.api_id)
                        {
                                // -- For local testing enter you test-code here:
                                flashVars['api_id'] = 1888171;
                                flashVars['viewer_id'] = 66748;
                                flashVars['sid'] = "7e22c25d7fece88f2316553937ff24f43e1073ca28e8b4302e65db35fa";
                                flashVars['secret'] = "6113n3e4g3";
                                // -- //
                        }
 
                        tF.type = TextFieldType.DYNAMIC;
                        tF.border = true;
                        tF.width = 200;
                        tF.height = 200;
                        addChild(tF);
 
 
                        VK.api('storage.set', { key:'var', value:'example' } );
                        VK.api('storage.get', { key:'var' }, completeFunc, errorFunc);
 
                        function completeFunc(vkObj:Object):void {
                                tF.appendText("completeFunc сработала");
                                if (vkObj[0] == "example")
                                {
                                        tF.appendText("Работает!");
                                }
                                else
                                {
                                        tF.appendText("Работает, но не так...");
                                }
                        }
 
                        function errorFunc(vkObj:Object):void {
                                tF.appendText("Ошибка");
                        }
                }
 
        }
 
}

Всё время выходит какая-то белиберда.

Это приложение заливается в Контакт. Дальше просто запускается. Если приложение "отключено", то в textField'e появляется сообщение "Ошибка", то есть срабатывает функция errorFunc. Если приложение "включено и видно всем", то в текстовом поле появляется "completeFunc сработала". Окей, я в правильном направлении.

Но вот как получить доступ к возвращённому функцией значению? Обращаюсь к официальному руководству по API:

http://vk.com/pages?oid=-1&p=storage.get

Ничего не проясняется... Да, функция возвращает значение. Но в каком виде? Я так понимаю, что в виде переменной экземпляра объекта, который передаётся в мою функцию completeFunc.

Возможно ошибка где-то в синтаксисе. Чтобы понять, как правильно обратить к возвращаемому значению я читал:
http://www.flasher.ru/forum/showthread.php?t=181260 - эту тему на форуме. Пробовал:
Код AS3:

if (vkObj[0] == "example")

ничего...
http://vk.com/topic-1_21972158 - искал в этой теме по ключевому слову "storage.get".
http://vk.com/topic-2226515_3507340 - искал в этой теме по тому же ключевому слову.
Пробовал:
vkObj.response
vkObj['response']
vkObj.data
vkObj.['data']
vkObj[0]

В общем что-то ничего не получается. Прошу объяснить мне, что не так и, если возможно, привести работающие примеры. Если что-то из списка выше того, что я пробовал, на самом деле верно, то укажите мне на это. Буду искать у себя ошибку.

П.С. И как бы мне просмотреть все переменные экземпляра у объекта и вывести их имена и значения?

Добавлено через 19 часов 9 минут
Много узнал про JSON, но всё-равно ничего не понимается.

Итак, возвращается значение в виде:

Код:

{"response":"example"}
Моя функция completeFunc в качестве аргумента получает декодированную JSON-строки в виде объекта, который присваивается переменной vkObj. Значит у этого объекта должна быть переменная экземпляра "response" со значением "example".
Внёс изменения в код, чтобы выполнить метод "encode" над vkObj и посмотреть JSON-строку в первоначальном виде:

Код AS3:

VK.api('storage.set', { key:'var', value:'example' } );
VK.api('storage.get', { key:'var' }, completeFunc, errorFunc);
 
function completeFunc(vkObj:Object):void {
        var data:String = JSON.encode(vkObj);
        tF.appendText(data);
        if (data == "example")
        {
                tF.appendText("Работает!");
        }
        else
        {
                tF.appendText("\nРаботает, но не так...");
        }
}
function errorFunc(vkObj:Object):void {
        tF.appendText("Ошибка");
}

В результате вывод выглядит так:
Цитата:

"example"
Работает, но не так...
??
Почему же выводится просто "example" (да еще и в кавычках), а не {"response":"example"}?

Что я делаю не так и как же мне всё-таки получить значение переменной, возвращаемое методом storage.get?

soundy_flash 28.10.2012 20:08

Коллеги, помогите же мне. Скажите хотя бы, с какого конца следует зайти? Что ещё требуется узнать?

caseyryan 28.10.2012 22:01

Просто responce обрабатывается еще в классе APIConnection и само слово отсекается
"example" у Вас и есть значение переменной "var". В коде все верно.

soundy_flash 28.10.2012 22:10

Цитата:

Сообщение от caseyryan (Сообщение 1101774)
Просто responce обрабатывается еще в классе APIConnection и само слово отсекается
"example" у Вас и есть значение переменной "var". В коде все верно.

Как я понял, из вашего сообщения, сервер ВКонтакте передаёт объект
Цитата:

{"response":"example"}
в моё приложение, но этот объект не приходит непосредственно в функцию, обрабатывающую успешное выполнение метода "storage.get", а сначала обрабатывается классом "APIConnection". То есть объект "vkObj", который я использую для того, чтобы принять значение переменной не выглядит так, как выглядел изначально:
Цитата:

{"response":"example"}
а как-то по-другому.

Но тогда есть такой вопрос. Как получить значение возвращаемой переменной, которая помещается в мой объект. Можно конечно снова кодировать в JSON-строку, а затем использовать специальную функцию, которая удалит лишние кавычки. Но мне кажется можно как-то получить значение "example" из объекта более элегантным способом.

П.С. Прошу прощения за обилие терминологии. Просто хочу, чтобы всё было точно понятно.

caseyryan 28.10.2012 22:48

soundy_flash, я не совсем понимаю, что вам нужно. У вас ведь слово "example" уже и есть значение, которое присвоено переменной под названием "var" на сервере контакта.
Напишите вместо "example" что-то другое, и в ответ придет эта строка.
storage хранит только строки. Вам никакой Object там не нужен.

Можно сделать, так например:
Код AS3:

VK.api('storage.set', { key:'dudeName', value:'firstName:Vasya|lastName:Pupkin' } );

А потом парсить эту строку при получении ее через storage.get

Сам response не нужен потому, что это единственный параметр. Можно возвращать сразу его значение.

soundy_flash 28.10.2012 23:01

Так точно! Кажется, что я вполне всё понял, после вашего объяснения. Значение "value" тоже задаётся в формате JSON. Соответственно, чтобы получить строку "example" по ключу "response" мне надо написать что-то вроде:
Код AS3:

VK.api('storage.set', { key:'var', value:'response:example' }, completeFunc);

Я не допонял лишь эту строку:
Цитата:

value:'firstName:Vasya|lastName:Pupkin'
Судя по схеме с сайта "введение в JSON":
http://www.json.org/object.gif
пары ключ/значение разделяются запятыми. А у вас в коде значения разделяются прямым слешем.

В любом случае, спасибо огромное. В самом главном я разобрался.

UPD:
Начинаю понимать. Сам JSON - это язык чисто для восприятия человеком. То есть если {"response":"example"} передается в некий объект, у объекта не появляется переменной "response" со значением "example". Это стандартизировано только для того, чтобы я, как программист, мог написать утилиты-парсеры для чтения этой строки.

caseyryan 29.10.2012 08:42

Цитата:

Я не допонял лишь эту строку:
Да не важно какая строка там будет. JSON или с произвольными разделителями.
Джейсон конечно удобнее.
Но можно, к примеру, туда и джейсон записать:
Код AS3:

var object:Object = {};
object.name = "Вася";
object.lastName = "Пупкин";
object.age = 15;
VK.api('storage.set', { key:'manInfo', value: JSON.encode(object) }, completeFunc);

А пришедшую в ответ на storage.get строку так же разобрать:
Код AS3:

JSON.decode(someObj);

В моем примере строку можно было с таким же успехом разбить по вертикальным линиям
Код AS3:

var array:Array = responseString.split("|"); // ну или по другим разделителям. Это всего лишь пример



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

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