One of the things that got me interested in OpenLaszlo was its pretty cool databinding features, which meant i could take in data from any standard XML document (be it a web page, xmlrpc, or even SOAP) and prototype a little interface around it very quickly, as i previously mentioned in my previous posts.
However, today i decided to take it a step further. I wanted to provide an interface to edit the data i obtain from a request and send back the results to the server. I also wanted to make use of the Ruby on Rails framework’s support for REST.
Being the naive person i am, i thought it was going to be a walk in the park. In OpenLaszlo, all you need to do to grab and display your data from the server is:
- Make a dataset and point it to your data (e.g. “http://localhost:3000/projects/1.xml”)
- Make a control with “datapath” set to an appropriate location in your dataset in XPath format (e.g. “dset:/project”)
- Call “doRequest” on your dataset
The call to “doRequest” can be done like so:
dset.setQueryType('GET');
dset.doRequest();
So naturally, i thought in order to POST the data from the dataset back to the server, i could do:
dset.setQueryType('POST');
dset.doRequest();
Which of course was completely wrong. I assumed that the API would work both ways (i.e. sending the data when the querytype is ‘POST’), which of course it didn’t. The only slightly helpful thing i could do was set the query string. However, this wasn’t quite compatible with REST, so i couldn’t use it as a solution.
After searching about a bit though, i came up with another solution:
var dp = new LzDatapointer();
dp.setPointer(parent.datapath);
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open('POST', url, true);
xmlHttpRequest.send(dp.serialize());
“Great!” i thought, “This should work!”. Sadly though, it didn’t. It seems that OpenLaszlo’s XMLHttpRequest doesn’t send any data in a POST. Great.
A short while later, i realised i should be using a ‘PUT’ request for updating my REST-ful object. The final nail hit the coffin when i got a nice error message from XHttpRequest – “method ‘PUT’ not supported, use GET or POST”. Aaaagh!!
Safe to say, OpenLaszlo’s data binding API is pretty one-sided when it comes to data. Grabbing data? fine. Sending data? welcome to hell. And not even XMLHttpRequest is of any use, unless you want to send a long long query string, or just stuff everything in the headers, both options which contradict REST.
In the future i think i’m going to take a look at Adobe’s Flex. I suspect it might handle REST requests a bit better.
