From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- includes/js/dojox/rpc/Rest.js | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 includes/js/dojox/rpc/Rest.js (limited to 'includes/js/dojox/rpc/Rest.js') diff --git a/includes/js/dojox/rpc/Rest.js b/includes/js/dojox/rpc/Rest.js new file mode 100644 index 0000000..5b79cf3 --- /dev/null +++ b/includes/js/dojox/rpc/Rest.js @@ -0,0 +1,90 @@ +if(!dojo._hasResource["dojox.rpc.Rest"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.Rest"] = true; +dojo.provide("dojox.rpc.Rest"); +dojo.require("dojox.rpc.Service"); +// This provides a HTTP REST service with full range REST verbs include PUT,POST, and DELETE. +// A normal GET query is done by using the service directly: +// var services = dojo.rpc.Service({services: {myRestService: {transport: "REST",... +// services.myRestService("parameters"); +// +// The modifying methods can be called as sub-methods of the rest service method like: +// services.myRestService.put("parameters","data to put in resource"); +// services.myRestService.post("parameters","data to post to the resource"); +// services.myRestService['delete']("parameters"); +dojox.rpc._restMethods = { // these are the common rest methods + put : function(r){ + // execute a PUT + r.url = r.target +'?'+ r.data; + r.putData = dojox.rpc._restMethods.sendData; + return dojo.rawXhrPut(r); + }, + post : function(r){ + // execute a POST + r.url = r.target +'?'+ r.data; + r.postData = dojox.rpc._restMethods.sendData; + var def = dojo.rawXhrPost(r); + var postObj = dojox.rpc._restMethods.sendObj; +/* This is a possible HTTP-compliant way to determine the id of a posted object + def.addCallback(function(result) { + dojox._newId = def.ioArgs.xhr.getResponseHeader('Content-Location'); + if (dojox._newId) {// we need some way to communicate the id of the newly created object + dojox.rpc._index[postObj._id = dojox._newId] = postObj; + } + return result; + });*/ + return def; + }, + "delete" : function(r){ + r.url = r.target +'?'+ r.data; + return dojo.xhrDelete(r); + } +} + +dojox.rpc._restMethods.put.sender = +dojox.rpc._restMethods.post.sender = true;// must declare that they send data + +dojox.rpc.transportRegistry.register( + "REST",function(str){return str == "REST"},{// same as GET... for now. Hoping to add put, post, delete as methods of the method + fire: function(r){ + r.url= r.target + (r.data ? '?'+ r.data : ''); + var def = dojo.xhrGet(r); + var newId = dojox.rpc._restQuery; + def.addCallback(function(res) { + dojox._newId = newId; // we need some way to communicate the id of the newly created object + delete dojox.rpc._restQuery; + return res; + }); + return def; + }, + getExecutor : function(func,method,svc){ + var executor = function(id) { + dojox.rpc._restQuery = id; + return func.apply(this,arguments); + }; + var restMethods = dojox.rpc._restMethods; + for (var i in restMethods) { // add the rest methods to the executor + executor[i] = (function() { + var restMethod = restMethods[i];//let + return function() { + + if (restMethod.sender) { + var sendData = dojox.rpc._restMethods.sendObj = arguments[--arguments.length]; + var isJson = ((method.contentType || svc._smd.contentType) + '').match(/application\/json/); + dojox.rpc._restMethods.sendData = isJson ? dojox.rpc.toJson(sendData,false,method._schema || method.returns) : sendData;// serialize with the right schema for the context; + } + for (var j = arguments.length++; j > 0; j--) + arguments[j] = arguments[j-1]; // shift them over + arguments[0] = dojo.mixin({restMethod: restMethod},method); + return svc._executeMethod.apply(svc,arguments); + } + })(); + + } + executor.contentType = method.contentType || svc._smd.contentType; // this is so a Rest service can be examined to know what type of content type to expect + return executor; + }, + restMethods:dojox.rpc._restMethods + } +); + +} -- cgit v1.2.3-54-g00ecf