AMF3 в AMFPHP 1.9
Запись от KBAC размещена 30.08.2011 в 13:38
В очередной раз стал использовать amfphp для связи сайта с админкой. Откопал свои старые наработки и обратил внимание, что во всех своих старых проектах с amfphp я разбираю amf0 объекты (массив массивов). Отчего мне надо было высчитывать номера нужных мне полей, которые я получал.
Ну вот и подумал с чего вдруг в AS3 мне работать со стандартом для AS2?
Начал разбирать. Оказалось, что когда я впервые использовал amfphp мне надо было очень быстро внедрить связку в сайт и поэтому я схватил первый вразумительный пример использования и особо не разбираясь стал его использовать.
В примере использовался класс Amf(исходники выкладываю без зазрения совести, так как и нашёл их в общем доступе):
package { import flash.net.Responder; import flash.net.NetConnection; import flash.utils.Dictionary; /** * @author Pavelk */ public class Amf { private var nc : NetConnection = new NetConnection(); public function Amf() { nc.connect("http://sampleamfphp.ru/amfphp/gateway.php"); nc.objectEncoding=3; } public function toamf(wht:String, cb : Function, ... args) : void { var resp:Responder = new Responder(cb, onFault); nc.call.apply(null,[wht,resp].concat(args)); } private function onFault(res:Object):void { trace('к севраку не достучались.',res); } } }
Где соответственно - путь и имя вызываемой функции, - callback метод, принимающий параметр типа Object. Так же можно добавить необходимое количество значений если вызываемая функция принимает какие-то параметры.
При выполнении, метод onGetNews получает объект, в свойстве initialData, которого находится массив со всеми значениями. На лицо Amf0.
Начинаем смотреть что не так. Обратим внимание, что в конструкторе класса Amf указано: — наверняка указываем, что хотим получать Amf3.
Здесь всё правильно, автор хочет чтобы мы получили amf3.
Но смотрим дальше на метод toamf:
public function toamf(wht:String, cb : Function, ... args) : void { var resp:Responder = new Responder(cb, onFault); nc.call.apply(null,[wht,resp].concat(args)); }
Запускаем и... получаем ошибку:
ArgumentError: Error #2173: Не удается прочитать объект в потоке. В классе flex.messaging.io.ArrayCollection не реализован интерфейс flash.utils.Iexternalizable, но в качестве его псевдонима используется класс с поддержкой внешних связей.
Гуглим. Первое что находим рассуждения в пустоту, вопросы без ответа и крики души, что amfphp не отдаёт нам amf3 пакеты, когда ему возвращают результат SELECT из базы MySQL.
Так... смотрим amfphp/browser/ там то мы получаем и amf0 и amf3 – на выбор!
Значит злобные создатели amfphp не такие негодяи как кажутся. Значит можно вытащить вполне человеческий amf3 объект.
Я стал думать о причинах. Если мы получаем ArrayCollection значит мы где-то создаём ArrayCollection.
Мои догадки подтвердиись. Смотрим файл amfphp/core/amf/io/AMFSerializer.php.
Находим там следующую строчку:
PHP код:
$this->writeAmf3ArrayCollectionPreamble();
Вобщем, судя по гуглу, не мне одному может пригодится то, что описано выше. Поэтому это всё и написано выше.
Welcome!
Всего комментариев 2
Комментарии
31.08.2011 13:40 | |
Ну вот и я раньше изворачивался. А потом неактуально было, сейчас подвернулось вот и разобрался. Рад что полезно))
|
Последние записи от KBAC
- AMF3 в AMFPHP 1.9 (30.08.2011)