Hi Juan,
Thanks for your email. This gives me some confidence of beign on the
wright track.
Why I tried the Loaderconfig.url "notnull" string hack was because it
just works but most of all because that's the only way of not having to
pass a reference to stage.loaderInfo.url since it is not nice to have a
proxy extending a DisplayObject and silly to pass a stage reference to
the remoting instance to get remoting to work.
The loaderInfo.parameters are of no importance to get it to work, so I
dropped it.
Good to remind me about the DTO registering, I only registered the basic
messaging classes but I will need some more in the future.
If you have made any examples to test this stuff, it would be nice to
see copy of your test-setup even if it looks hacky.
Feel free to (not) send me.
Ciao,
Latcho
Juan Pablo Califano wrote:
Hi,
I've had this same issue some weeks ago. In my case, I had to use an
existing back-end that was consumed by a Flex app using RemoteObjects.
The requirement was to replace the front-end with a more lightweight
AS pure client, but keeping the back-end. After googling a bit, I
found, as you did, that the trick was manually registering the Flex
classes that take part in the communication process (before attempting
any communication!); this is something you get for free if you setup a
Flex project, by the way (by means of the Remote meta-tag).
I just made some tests to see whether it was feasible and haven't
built the real thing yet, but I it worked ok against my local service
(I installed BlazeDS) and against the production service (they're
using FDS, I think).
About the mx_internal "hack", I used this code (found it googling):
var swfURL:String = this.loaderInfo.url;
LoaderConfig.mx_internal::_url = this.loaderInfo.url;
LoaderConfig.mx_internal::_parameters = this.loaderInfo.parameters;
It worked fine. I don't know if it's better this way or your way, though.
Maybe you already know this, but another important thing is to map /
register your DTO's before calling the backend; otherwise, the
serialization / deserialization fails.
I've used this code:
private function mapAppRemoteClasses():void {
// map the classes that represent entities in the backend to the AS
classes
registerClassAlias("ar.com.califa010.remotingTest.User",User);
}
(Again, in flex project I think you'd just put a [Remote] tag on you
class, but in an AS project you have to do it manually).
Regarding the destination, I set it through the remote object using an
id. The actual mapping to the Java entry point is on the server; in my
case (BlazeDS), in the remoting-config.xml
<destination id="userservice-test">
<properties>
<source>ar.com.califa010.remotingTest.UserService</source>
</properties>
</destination>
So, in the AS side:
private function setupUserService():void {
_userService = new RemoteObject();
_userService.destination = "userservice-test";
_userService.channelSet = _amfChannelSet;
_userService.getFriends.addEventListener(ResultEvent.RESULT,handleServiceResult);
_userService.getFriends.addEventListener(InvokeEvent.INVOKE,handleServiceInvoke);
_userService.getFriends.addEventListener(FaultEvent.FAULT,handleServiceFault);
_userService.loginUser.addEventListener(ResultEvent.RESULT,handleServiceResult);
_userService.loginUser.addEventListener(InvokeEvent.INVOKE,handleServiceInvoke);
_userService.loginUser.addEventListener(FaultEvent.FAULT,handleServiceFault);
// call methods to test the service...
_userService.getFriends();
_userService.loginUser("username","pass");
}
As far as I know, you won't lose any significant functionality. You'll
lose some of the amenities provided by Flex (I mean compiling as a
Flex Project), like data binding, automatic alias registration,
automatic linking to the framework dependencies and probably some more
(I don't have much experience in Flex projects).
Hope this helps, and if you find out something interesting, please share!
Cheers
Juan Pablo Califano
2009/3/12, Latcho <spamtha...@gmail.com <mailto:spamtha...@gmail.com>>:
Hi friends,
I'm a bit of a novice when it comes to remoting.
I want to be able to use remoting with weborb-php in AS3 pure
sang, fairly compact , without mxml configuation and remaining as
functional as possible.
Setting a direct endpoint into the remotingObject amfchannel was
quite impossibe due to it beign a getter only and only
configurable trough mxmlc,
So I had to set up a channel.
I also had to hack the mx messaging config LoaderConfig's url ,
otherwise the flex mx.rpc's classes fail, if it remains a null value.
(found this hack/tip here:
http://bugs.adobe.com/jira/browse/BLZ-16#action_171947 but
figgured it can hold any value as long it's not null)
So I did this
public dynamic class AMFService extends RemoteObject
{
....
mx.messaging.config.LoaderConfig.mx_internal::_url =
"notnull";
public function AMFService(.......)
(
_amfChannel = new
AMFChannel(_destinationChannel,_serviceGateway);
_amfChannel.connectTimeout = _conectTimeOut;
_amfChannel.requestTimeout = _requestTimeout;
var myChannelSet:ChannelSet = new ChannelSet();
myChannelSet.addChannel(_amfChannel);
` }
furthermore this to solve some Typing errors and to get the of
Messages wright wright
static private function registerClassAliases():void
{
/* REGISTERCLASSALIAS()
* Preserves the class (type) of an object when the
object is encoded in Action Message Format (AMF).
* When you encode an object into AMF, this function
saves the alias for its class,
* so that you can recover the class when decoding the
object.
* If the encoding context did not register an alias for
an object's class,
* the object is encoded as an anonymous object.
* Similarly, if the decoding context does not have the
same alias registered,
* an anonymous object is created for the decoded data.
* */
registerClassAlias("DSA", AsyncMessageExt);
registerClassAlias("flex.messaging.messages.AsyncMessage",
AsyncMessage);
registerClassAlias("DSA", AsyncMessageExt);
registerClassAlias("DSC", CommandMessageExt);
registerClassAlias("flex.messaging.messages.CommandMessage",CommandMessage);
registerClassAlias("flex.messaging.messages.RemotingMessage",
RemotingMessage);
registerClassAlias("DSK", AcknowledgeMessageExt);
registerClassAlias("flex.messaging.messages.AcknowledgeMessage",
AcknowledgeMessage);
registerClassAlias("flex.messaging.messages.ErrorMessage",
ErrorMessage);
registerClassAlias("flex.messaging.messages.HTTPMessage",HTTPRequestMessage);
registerClassAlias("flex.messaging.messages.SOAPMessage",
SOAPMessage);
registerClassAlias("flex.messaging.messages.MessagePerformanceInfo",
MessagePerformanceInfo);
registerClassAlias("flex.messaging.io.ArrayList", ArrayList);
registerClassAlias("flex.messaging.io.ArrayCollection",ArrayCollection);
registerClassAlias("flex.messaging.io.ObjectProxy",ObjectProxy);
registerClassAlias("flex.messaging.config.ConfigMap",
ConfigMap);
}
Now my questions:
Is this the best way to keep it tiny and pure AS3 without mxml
Do I drop functionallity here if it comes to remoting (and not to
the remote data processing) ?
Can this be done in an oher AS3 way without hacking with the
mx_internal trick ?
FYI, the filesize of my remoting test is now 86Kb in release mode.
Please help me out of uncertainty :)
Tnx
Latcho
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
<mailto:Flashcoders@chattyfig.figleaf.com>
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders