Как использовать AMFPHP с Apache Royale - PullRequest
3 голосов
/ 04 октября 2019

У меня проблема с использованием 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»: «services-config.xml» в compilerOptions, но не работает)

Вот мой service-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   

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

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вот несколько протестированных рабочих кодов на 0.9.6 sdk (обратите внимание, что вы должны использовать config flex, чтобы иметь возможность использовать mx, если у вас проблема с библиотекой mx). протестировано с AMFPHP v1.9 и 2.0 от 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>

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

1 голос
/ 04 октября 2019

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

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

...