[Zope3-Users] z3c.jsonrpc response content type bug

Yuan HOng hongyuan1306 at gmail.com
Wed Oct 29 05:09:58 EDT 2008


Hi, Roger,

>
> That's very interesting, which JS library are you using for JSON-RPC calls
> from ExtJS?
> Or does ExtJS provide JSON-RPC calls out of the box?
>

No, it is regretful that ExtJS (at least 2.0.1 which I am using)
doesn't function well with z3c.jsonrpc out of the box, because
z3c.jsonrpc is expecting a content type 'application/json' while the
default json implementation of that of ExtJS sends out
'application/x-www-form-urlencoded'.

So I use a slightly customized version which overrides several
functions of the default Ext.lib.Ajax, especially the request method,
to add the required header.

 Ext.lib.Ajax.asyncRequest = function(method, uri, callback, postData, async){
    var o = this.getConnectionObject();
    if (!o) {
        return null;
    }
    else {
        o.conn.open(method, uri, async);
        if (this.useDefaultXhrHeader) {
            if (!this.defaultHeaders['X-Requested-With']) {
                this.initHeader('X-Requested-With',
this.defaultXhrHeader, true);
            }
        }
        if(postData && this.useDefaultHeader &&
(this.headers['Content-Type']===undefined)){
            this.initHeader('Content-Type', this.defaultPostHeader);
        }
         if (this.hasDefaultHeaders || this.hasHeaders) {
            this.setHeader(o);
        }
        this.handleReadyState(o, callback);
        o.conn.send(postData || null);
        return o;
    }
 };

 Ext.lib.Ajax.request = function(method, uri, cb, data, options) {
    if(options){
        var hs = options.headers;
        if(hs){
            for(var h in hs){
                if(hs.hasOwnProperty(h)){
                    this.initHeader(h, hs[h], false);
                }
            }
        }
        if(options.xmlData){
            this.initHeader('Content-Type', 'text/xml', false);
            method = 'POST';
            data = options.xmlData;
        }else if(options.jsonData){
            this.headers['Content-Type'] = 'application/json';
            this.hasHeaders = true;
            method = 'POST';
            data = typeof options.jsonData == 'object' ?
Ext.encode(options.jsonData) : options.jsonData;
        }
    }
    var async = (options.async === false) ? false : true;
    return this.asyncRequest(method, uri, cb, data, async);
 };

I made a report of this to the ExtJS folks. And the source code of the
most recent version 2.2 now has 'application/json' in the request
method. I suppose it should be working out of box now, although I am
still using the old version.

-- 
Hong Yuan

大管家网上建材超市
装修装潢建材一站式购物
http://www.homemaster.cn


More information about the Zope3-users mailing list