Skip to content

RPC and JavaScript APIs

vankeisb edited this page Oct 11, 2011 · 8 revisions

Woko has built-in support for AJAX via its RPC services, that can be accessed over HTTP, or using a dedicated JavaScript API.

RPC services

All CRUD operations (load, save, delete, search, list) are available remoteloy through dedicated services. All you can do in the “developer” interface can be done via RPC calls.
You can also invoke your own Resolution Facets in an AJAX fashion : Woko provides a mechanism to write Resolution Facets that can return either HTML or JSON data depending on the caller.

load

Return a POJO as JSON, using the json facet on it.

http://.../view/MyClass/123?isRpc=true

save

Persists a POJO and returns it as JSON.

http://.../save/MyClass?isRpc=true&object.id=123&object.prop=foobar...

delete

Removes a POJO from persistent storage, and returns a confirmation object.

http://.../delete/MyClass/123?isRpc=true&facet.confirm=true

find

List instances of a class, returning the structure as JSON (includes total counts and other pagination data).

http://.../list/MyClass?isRpc=true&facet.resultsPerPage=100&facet.page=0

search

Full text search, returned as JSON result.

http://.../search?isRpc=true&facet.query=moby&facet.resultsPerPage=100&facet.page=0

Invoking your own facets

Of course, you can also invoke your own facets over HTTP (TODO explain RpcResolution for how to return resolutions from your facets that handle both HTML and JSON outputs).

JavaScript API

All the services mentionned above can be reached using a dedicated JavaScript API :


<script src="./woko/js/woko.base.js"></script>
<script src="./woko/js/woko.rpc.js"></script>

var cli = new woko.rpc.Client({baseUrl:"/woko-webtests"});

            cli.save({
                className:"MyBook",
                obj: {
                    _id: 1234,
                    name: "Moby Dick"
                },
                load: function(savedBook) {
                    log(new Date() + " - Save1 : id = " + savedBook._id + " name = " + savedBook.name);

                    // load the saved book
                    cli.load({
                        className: "MyBook",
                        key: 1234,
                        load: function(loadedBook) {
                            log(new Date() + " - Reload : id = " + loadedBook._id + " name = " + loadedBook.name);

                            // update a property
                            loadedBook.nbPages = "123";
                            loadedBook.name = "tower";

                            // save the book again
                            cli.save({
                                obj: loadedBook,
                                load: function(savedBook2) {
                                    log(new Date() + " - Save2 : id = " + loadedBook._id + " name = " + loadedBook.name);

                                    // delete the book
                                    cli.remove({
                                        obj: savedBook2,
                                        load: function(result) {
                                            log(new Date() + " - Deleted : id = " + savedBook2._id + " name = " + savedBook2.name + " (success = " + result.success + ")");
                                            var loader = dojo.byId("loader");
                                            loader.innerHTML = "loaded";
                                            dojo.removeClass(loader, "loading");
                                            dojo.addClass(loader, "loaded");
                                        }
                                    });
                                }
                            });
                        }
                    });
                }
            });

Clone this wiki locally