2008年10月19日星期日

[fw-webservices] Is this a bug in Zend Json Server?

Hello,

I am using Zend 1.6 with Dojo 1.2. I tried to set up a JSON-RPC server
with Zend_JSON_Server and got the following error message from Firebug:

SyntaxError: missing ) in parenthetical message=missing ) in
parenthetical

SMD content (from http://localhost/TestSite/rpc/smd):

{"SMDVersion":".1","serviceType":"JSON-RPC","methods":
[{"name":"add","serviceURL":"\/TestSite\/rpc\/service","parameters":
[{"name":"x","type":"integer"},{"name":"y","type":"integer"}]},
{"name":"subtract","serviceURL":"\/TestSite\/rpc\/
service","parameters":[{"name":"x","type":"integer"},
{"name":"y","type":"integer"}]},{"name":"multiply","serviceURL":"\/
TestSite\/rpc\/service","parameters":[{"name":"x","type":"integer"},
{"name":"y","type":"integer"}]},{"name":"divide","serviceURL":"\/
TestSite\/rpc\/service","parameters":[{"name":"x","type":"integer"},
{"name":"y","type":"integer"}]},{"name":"echomsg","serviceURL":"\/
TestSite\/rpc\/service"}]}{"error":{"code":-32600,"message":"Invalid
Request","data":null},"id":null}

If I insert a comma (,) between } and {"error" manually, I will not
get this error message. Is this a bug or I did something wrong here?

Controller:

Class RpcController extends CustomControllerAction{
public function smdAction() {
$this->_helper->layout->disableLayout();

/* 1. Instantiate the server object */
$server = new Zend_Json_Server();

/* 2. Attach class to the server object */
$server->setClass('Calculator');
$server->setClass('test');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
$server->setTarget($this->getHelper('url')-
>url(array('controller'=>'rpc', 'action'=>'service')))
->setId($this->getHelper('url')->url(array('controller'=>'rpc',
'action'=>'service')))
->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

$smd = $server->getServiceMap();

// Set Dojo compatibility:
$smd->setDojoCompatible(true);
header('Content-Type: application/json');
echo $smd;
}
/* 3. Handle the request */
$server->handle();
}

public function serviceAction() {
$this->_helper->layout->disableLayout();
$server = new Zend_Json_Server();
$server->setClass('Calculator');
$server->setClass('test');
$server->setAutoEmitResponse(true);
$server->handle();
}
......
}

view:

<script type="text/javascript">
dojo.require("dojo.rpc.JsonService");
var server = new dojo.rpc.JsonService("/TestSite/rpc/smd")
console.debug(server);
var t = server.echomsg();
console.debug(t);
t.addCallback( function(msg) {
alert(msg);
});

</script>

Feedbacks are welcomed.

Bin

没有评论: