Как использовать AMPHP с Apache Royale

У меня проблема с использованием SimpleRemoteObject. (SDK 0.9.6)

Мой фактический веб-сайт использует этот код для вызова удаленной функции с помощью Amfphp:

<mx:RemoteObject id="ro" source="aadmin" destination="amfphp">
    <mx:method name="siteLogin" fault="{onRcv_siteLoginErr(event)}" result="{onRcv_siteLogin(event)}"/>
</mx:RemoteObject>

Поскольку <mx:method/> не существует в Apache Royale, я установил этот код:

 </js:beads>
        <js:SimpleRemoteObject id="sro" source="aadmin" result="onResult(event)" fault="onFault(event)"
                         endPoint = "http://amfphp.myserver_url.com/gateway.php"
                         destination = "amfphp" />
 </js:beads>

aadmin - это мое имя службы класса php

Чтобы вызвать мою функцию, я делаю:

 sro.send("siteLogin",["123"]);

где siteLogin — моя функция для вызова внутри класса aadmin

Запустив это, у меня есть эта проблема:

The class {Amf3Broker} could not be found under the class path {/home/www/amfphp/services/amfphp/Amf3Broker.php}

Почему он показывает Amf3Broker ? У кого-нибудь есть пример работы SimpleRemoteObject с amfphp?

На стороне сервера я использую https://github.com/silexlabs/amfphp-1.9

Нужно ли мне настраивать файл service-config.xml? Если да, то как использовать его с компилятором? (Я пробовал «сервисы»: «services-config.xml» в компилятореOptions, но не работал)

Вот мой сервис-config.xml:

<services-config>
    <services>
        <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="amfphp">
                <channels>
                    <channel ref="my-amfphp"/>
                </channels>
                <properties>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>
<channels>
    <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel">
        <endpoint uri="http://amfphp.myserver.com/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties><add-no-cache-headers>false</add-no-cache-headers></properties>
    </channel-definition>
</channels> 
</services-config>

Теперь я провел тест с amfphp V2.0 из https://github.com/silexlabs/amfphp-2.0

Это немного лучше, но у меня есть ошибка. Кажется, есть проблема со свойством _explicitType. Более того, я не вижу своего аргумента ('123') в [requestMessage]

    /onStatusî$flex.messaging.messages.ErrorMessage
correlationId   faultCode@ faultDetailfaultStringvUndefined property: stdClass::$_explicitType . 
<br>file:  /home/www/mysite.com/amfphpv2/Plugins/AmfphpFlexMessaging/AmfphpFlexMessaging.php 
<br>line: 113 
<br>context: Array
(
    [requestMessage] => Amfphp_Core_Amf_Message Object
        (
            [targetUri] => null
            [responseUri] => /1
            [data] => Array
                (
                    [0] => stdClass Object
                        (
                            [body] => stdClass Object
                                (
                                )

                            [clientId] => 
                            [correlationId] => 
                            [destination] => amfphp
                            [headers] => stdClass Object
                                (
                                )

                            [messageId] => EF4BF9E3-5C02-1060-1FF3-5D9781F55A31
                            [operation] => 13
                            [timeToLive] => 0
                            [timestamp] => 0
                        )

                )

        )

    [serviceRouter] => Amfphp_Core_Common_ServiceRouter Object
        (
            [serviceFolders] => Array
                (
                    [0] => /home/www/mysite.com/amfphpv2/Core/../Services/
                )

            [serviceNames2ClassFindInfo] => Array
                (
                    [AmfphpMonitorService] => Amfphp_Core_Common_ClassFindInfo Object
                        (
                            [absolutePath] => /home/www/mysite.com/amfphpv2/Plugins/AmfphpMonitor/AmfphpMonitorService.php
                            [className] => AmfphpMonitorService
                        )

                    [AmfphpDiscoveryService] => Amfphp_Core_Common_ClassFindInfo Object
                        (
                            [absolutePath] => /home/www/mysite.com/amfphpv2/Plugins/AmfphpDiscovery/AmfphpDiscoveryService.php
                            [className] => AmfphpDiscoveryService
                        )

                )

            [checkArgumentCount] => 1
        )

    [explicitTypeField] => _explicitType
)
    rootCause   

Заранее благодарю за любую помощь...


person Fred    schedule 04.10.2019    source источник


Ответы (2)


Вот некоторый протестированный рабочий код для 0.9.6 sdk (обратите внимание, что вы должны использовать config flex, чтобы иметь возможность использовать mx, если у вас есть проблемы с библиотекой mx). протестировано с v1.9 и v2.0 AMPHP от silexlabs:

<fx:Declarations>
    <mx:RemoteObject id="ro"  result="onResult(event)" fault="onFault(event)" source="your-service-php-class"
                        endpoint = "https://www.your-amfphp-server.com/amfphp/gateway.php"
                        destination = "amfphp" />
</fx:Declarations>

Затем в сценарии

ro.getOperation("your-php-function-to-call").send("your-param");

[обновление] Важно: убедитесь, что это есть в вашем приложении, иначе у вас будет такая ошибка, как *The class {Amf3Broker} could not be found*

<mx:beads>
    <js:ClassAliasBead />
</mx:beads>

[обновление № 2] Вы хотите использовать config royale, но также хотите, чтобы библиотеки MX использовали удаленный объект MX? Вот как это сделать: asjs/issues/495#issuecomment-539906300

person Fred    schedule 07.10.2019

бэкенды, которые, как я знаю, работают (из моего собственного опыта): Java и .NET(Fluorine). AMFPHP тоже должен работать. Другие пробовали это, но это было почти год назад, когда AMF не был полностью разработан. Прямо сейчас AMF в Royale очень надежен и очень хорошо работает со всеми типами, за исключением Vector и Dictionary (я полагаю, что когда-нибудь они появятся, но, поскольку это типы AS3, на данный момент имеет более низкий приоритет).

Здесь главное использовать MXRoyale версию RemoteObject (эмуляция mx:RemoteObject), так как она наиболее близка к Flex RemoteObject. Остальные в Network lib — это более легкие классы, реализованные в виде бусинок, которые первыми появились в Royale. Но, по крайней мере, в моем случае я переключился на mx:RemoteObject, чтобы убедиться, что остальные работают на том же уровне.

person Carlos Rovira    schedule 04.10.2019