Search code examples
javablazedsamf

AMF client in Java


I am using BlazeDS java client to get info from this page. This page has a form in the middle that when you select a type, the location combo on the button gets updated.

I am trying to use BlazeDS to get those values in java. I have been using Charles web proxy to debug, and this are the screenshots from the request and the response:

My code so far is the following:

        // Create the AMF connection.
        AMFConnection amfConnection = new AMFConnection();

        // Connect to the remote url.
        String url = "http://orlandoinfo.com/flex2gateway/";
        try
        {
            amfConnection.connect(url);
        }
        catch (ClientStatusException cse)
        {
            System.out.println(cse);
            return;
        }

        // Make a remoting call and retrieve the result.
        try
        {
//          amfConnection.registerAlias("flex.messaging.io.ArrayCollection", "flex.messaging.io.ArrayCollection");
            amfConnection.call("ColdFusion.getLocations", new Object[] {"consumer", "attractions", "ATTR"});

        }

        catch (ClientStatusException cse)
        {
            System.out.println(cse);
        }
        catch (ServerStatusException sse)
        {
            System.out.println(sse);
        }

        // Close the connection.
        amfConnection.close();

When I run it I get a:

ServerStatusException 
    data: ASObject(15401342){message=Unable to find source to invoke, rootCause=null, details=null, code=Server.Processing}
    HttpResponseInfo: HttpResponseInfo 
    code: 200
    message: OK

Can anyone spot what's wrong?

Thanks for reading!


Solution

  • I ended up using Charles Web Proxy. Sniffing AMF parameters and running my code with -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888

    I compare both calls and modify to look alike. The working code looks like this:

    String url = "http://www.theGateWayurl.com";
    // Generates the connection to the amf gateway.
    AMFConnection amfConnection = new AMFConnection();
    
    // Must register the class that this library will use to load the
    // AMF object information.
    // The library will read AMF object variables and use setters from
    // the java bean stated in this line.
    AMFConnection.registerAlias("", new LabelData().getClass().getName());
    
    try {
        // Do the connection.
        amfConnection.connect(url);
    
        // This page requires a certain headers to function.
        // The Content-type is used to sniff with Charles Web Proxy.
        amfConnection.addHttpRequestHeader("Content-type", "application/x-amf");
        // The Referer is used by the webpage to allow gathering information.
        amfConnection.addHttpRequestHeader("Referer", "http://orlandoinfo.com/ws/b2c/sitesearch/customtags/comSearch.swf");
    
        // The rest of the HTTP POST sent by this library is wrapped
        // inside a RemotingMessage.
        // Prepare the msg to send.
        RemotingMessage msg = new RemotingMessage();
    
        // The method called in the server.
        msg.setOperation("getLocations");
    
        // Where the request came from. Similar to referer.
        msg.setSource("ws.b2c.sitesearch.components.myService");
    
        // The destination is a needed parameter.
        msg.setDestination("ColdFusion");
    
        // Create the body with the parameters needed to call the
        // operation set with setOperation()
        msg.setBody(new Object[] {"consumer", "attractions"});
    
        // This is needed but not used.
        msg.setMessageId("xxxxxxxxxx");
    
        // Send the msg.
        AcknowledgeMessage reply = (AcknowledgeMessage) amfConnection.call("null", msg);
    
        // Parse the reply from the server.
        ArrayCollection body = (ArrayCollection) reply.getBody();
        for (Object obj : body) {
            LabelData location = (LabelData) obj;
            // Do something with the info.
        }
    
    } catch (ClientStatusException cse) {
        // Do something with the exception.
    
    } catch (ServerStatusException sse) {
        // Do something with the exception.
    } finally {
        amfConnection.close();
    }
    

    The LabelData is just a java bean with with two vars: Data and Label. I tried to comment every line for a better understanding. Take into account what Stu mention in previous comments about crossdomain.xml to see if you have the rights to do this kind of things.