Opened 14 years ago
Last modified 14 years ago
#6756 closed defect
JSON Procedure Call with named parameters — at Version 1
Reported by: | guest | Owned by: | Dustin Machi |
---|---|---|---|
Priority: | high | Milestone: | |
Component: | RPC | Version: | 1.1.0 |
Keywords: | RPC, JSON, named parameters | Cc: | alex |
Blocked By: | Blocking: |
Description (last modified by )
It is not possible to make JSON RPC with named parameters.
Example:
var myObject = new dojo.rpc.JsonService("/definition.smd"); var myDeferred = myObject.add(121,5}); myDeferred.addCallback(myCallbackMethod); myDeferred.addErrback(myErrorbackMethod);
add method definition:
methods:[ { name: "add", parameters: { { name: "x", type: "integer" }, { name: "y", type: "integer" } }
Expected: params = {x:131,y:5}
Result:
[ Error: invalid property id ] [ Error: Unable to load SMD from https://www.somewebsite.org/definition.smd ]
Details:
According to http://groups.google.com/group/json-rpc/web/simple-method-description-for-json-rpc-example if parameters are given as object than it indicates that named parameters should be used for this method.
It is not possible to give parameters as object. If definition smd is changed to:
methods:[ { name: "add", parameters: [ { name: "x", type: "integer" }, { name: "y", type: "integer" ] }
submitted parameters are {131,5}
Even in case that it would be possible to load smd with parameters defined as object on line 136 of dojo/rpc/RpcService.js it would not be taken in account but given runtime arguments would be converted to array and submitted as parameters.
Resolution:
- Enable parsing smd with parameters given as objec
- Follow JSON-RPC (over HTTP) specification/example and correctly pass parameters as position or named.
I could not find out why smd is not parsed (I am new to JavaScript?) but once that is resolved than something like this could be done: add method:
toNamed: function(args, param) {
var i; var data = {}; for (i=0; i<param.length; i++) {
data[param[i].name] = args[i];
} return data;
}
and than on line 136 do something like this:
if (true === dojo.isObject(parameters)) { this.bind(method, this.toNamed(dojo._toArray(arguments), parameters), deferredRequestHandler, url); } else { this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url); }
Change History (2)
Changed 14 years ago by
Attachment: | dojo.response.txt added |
---|
comment:1 Changed 14 years ago by
Description: | modified (diff) |
---|
details of error response