The REST API interface is pretty straightforward, so you can recreate this with UrlFetch if you like. However this packages all the things you can do from the client in a simple library, and is has same call formats as the JavaScript version.
Where to get it
You can include the library in your project – the key is
19rhki6VDTWk4v1RDb6u1d5E-nNaQq8sXCnRnFzUpp4V4lmZ9Z6R_PP9n
or get a copy here from Github.
Code
Most of the demos and libraries mentioned in these pages are available in their own GitHub repo, but for convenience, there is a consolidated repo where I’ll push all the associated code. If you’d like to contribute, please make a PR there.
Demo
Before starting
You’ll need to get a boss key. If you want to play with the tests below (or on github). You can get a boss key by visiting the API home, registering, and creating one in the Console. I also recommend you take a look at the tutorial there to get a feel for some of the concepts.
Examples
This is a series of tests that exercise the common functions available in the library. Check the log file for which Urls the requests are turned into.
function testEfx() { // set up client var efx = EffexApiClient.setProd().setVerbose(true); // boss key comes from console /// replace this with your own var bossKey ="bx-----------------"; // check service is up var result = efx.ping(); assure ( result && result.ok ,"ping", result); // give up if its not if (!result.ok) { throw 'service is not up:' + JSON.stringify(result); } // get some service info var result = efx.info(); assure ( result && result.ok ,"info", result); // check boss key hasnt expired var result = efx.validateKey(bossKey); assure ( result && result.ok ,"validate bosskey", result); // get 1 writer key expiringin in 5 minutes var writers = efx.generateKey (bossKey,"writer", {seconds:5*60}); assure ( writers && writers.ok && writers.keys.length === 1 ,"writerkeys", writers); // get 2 readr keys expiringin in 5 minutes var readers = efx.generateKey (bossKey,"reader", {seconds:5*60, count:2}); assure ( readers && readers.ok && readers.keys.length === 2 ,"readerkeys", readers); // get 1 updater keys expiringin in 5 minutes var updaters = efx.generateKey (bossKey,"updater", {seconds:5*60}); assure ( updaters && updaters.ok && updaters.keys.length === 1 ,"updaterkeys", updaters); // set the keys up as default so we dont have to bother specifying them later efx.setKeys ({ updater:updaters.keys[0], writer:writers.keys[0], reader:readers.keys[0] }); // more convenient for later var keys = efx.getKeys(); //---reading and writing var someData = {name:'xyz',a:[1,2,3],b:2000}; var data = efx.write(someData); assure ( data && data.ok ,"write-post", data); // read it back with the same key var result = efx.read( data.id, keys.writer); assure ( result && result.ok && JSON.stringify(result.value) === JSON.stringify(someData) ,"read", result); // do it again, but use a GET for writing var data = efx.write(someData, keys.writer, "get"); assure ( data && data.ok ,"write-get", data); // read it back with the same key var result = efx.read( data.id, keys.writer); assure ( result && result.ok && JSON.stringify(result.value) === JSON.stringify(someData) ,"read-get", result); // now do all that with some text data var textData = "some text data"; var data = efx.write(textData); assure ( data && data.ok ,"write-post-text", data); // read it back with the same key var result = efx.read( data.id, keys.writer); assure ( result && result.ok && result.value === textData ,"read-text", result); // do it again, but use a GET for writing var data = efx.write(textData, keys.writer, "get"); assure ( data && data.ok ,"write-get-text", data); // read it back with the same key var result = efx.read( data.id, keys.writer); assure ( result && result.ok && result.value === textData ,"read-get-text", result); //-- assigning readers and updaters var data = efx.write(someData,keys.writer,"post",{readers:keys.reader,updaters:keys.updater}); assure ( data && data.ok ,"write-for-others", data); // read it back with a reader key var result = efx.read( data.id); assure ( result && result.ok && JSON.stringify(result.value) === JSON.stringify(someData) ,"read-reader", result); // read it back with an updater key var result = efx.read( data.id, keys.updater); assure ( result && result.ok && JSON.stringify(result.value) === JSON.stringify(someData) ,"read-updater", result); // update it var result = efx.update (textData , data.id); assure ( result && result.ok ,"update", result); // check it took - i'll just use the reader key var result = efx.read( data.id); assure ( result && result.ok && result.value === textData ,"read-updated", result); //----work with aliases // assign an alias for the reader key to use var alias = efx.registerAlias( keys.writer, keys.reader, data.id, "somename"); assure ( alias && alias.ok ,"alias", result); // read it back with a reader key, using the data alias var result = efx.read( alias.alias); assure ( result && result.ok && result.value === textData ,"assign-alias", result); // write another rec to the same alias var otherData = efx.write(someData,keys.writer,"post",{readers:keys.reader,updaters:keys.updater}); assure ( otherData && otherData.ok ,"write-for-others-alias", otherData); // assign the alias to the new data var otherAlias = efx.registerAlias( keys.writer, keys.reader, otherData.id, alias.alias); assure ( otherAlias && otherAlias.ok && otherAlias.alias === alias.alias ,"other-alias", otherAlias); // read it back with a reader key, using the data alias var result = efx.read( alias.alias); assure ( result && result.ok && JSON.stringify(result.value) === JSON.stringify(someData) ,"read-otheralias", result); // assign and update alias to an updater key var updateAlias = efx.registerAlias( keys.writer, keys.updater, otherData.id, alias.alias); assure ( updateAlias && updateAlias.ok && updateAlias.alias === alias.alias ,"updater-alias", updateAlias); // update it var result = efx.update(textData , alias.alias); assure ( result && result.ok ,"update-alias-write", result); // read it back using the reader alias var result = efx.read (alias.alias); assure ( result && result.ok && result.value===textData,"read-update-alias", result); // try deleting the underlying data item using the alias.. should fail because we didnt assign an alias to the writer key var result = efx.remove (alias.alias); assure ( !result.ok ,"remove-should-fail", result); // assign alias to the writer key var writerAlias = efx.registerAlias( keys.writer, keys.writer, otherData.id, alias.alias); assure ( writerAlias && writerAlias.ok && writerAlias.alias === alias.alias ,"writer-alias", updateAlias); // now this should work var result = efx.remove (alias.alias); assure ( result && result.ok ,"remove-should-work", result); // check the underlying is gone var result = efx.read (alias.alias, keys.writer); assure ( !result.ok,"read-should-fail", result); } function assure (b , message , result) { verbose = true; if (!b) { Logger.log ("failed:"+message + ' : result : ' + (result ? JSON.stringify(result) : "")); } if (verbose && b) { Logger.log ("passed:"+message); } return b; }
For more like this, see Google Apps Scripts snippets.
Accordeon