使用PUT方法时无法检索JSON作为参数

时间:2012-05-23 06:30:33

标签: servlets extjs put

我使用ExtJS执行AJAX请求。这是我的代码

Ext.Ajax.request({
    url: 'TestServer',
    method: 'PUT',
    params: {
        json: Ext.encode({
            name: 'dummy'
        })
    }
});

所以我决定从servlet获取request参数。所以我已经使用了

request.getParameter("json")

但我得到一个空值。当我使用POST方法时它很好用,但不是PUT。在使用PUT方法时,有没有其他方法可以在servlet中获取请求参数?

1 个答案:

答案 0 :(得分:1)

来自Ext.Ajax 4.1 Docs

  

方法:字符串       用于请求的默认HTTP方法。请注意,这是区分大小写的,应该是全部大写(如果没有设置但是params存在将使用“POST”,否则将使用“GET”。)

文档没有提到允许PUT,但它也没有提到禁止PUT。

此外,还有一些文档说明如何使用HTTP Method Override使servlet调用映射到PUT或DELETE的服务。

有人会建议使用HTTP方法覆盖,而不是简单地直接使用PUT或DELETE,再加上Ext.Ajax文档,省略其他HTTP方法选项,这强烈暗示你要做的事情是不可能使用Ext

这看起来很奇怪,考虑到原始XmlHttpRequests甚至jQuery AJAX都是可能的。

但是,利用JavaScript的动态类型和功能特性,可以使用this forum post中的代码轻松覆盖/扩展默认的Ajax功能:

   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 = (options.method == 'PUT' ? 'PUT' : 'POST');
                data = options.xmlData;
            }else if(options.jsonData){
                this.initHeader('Content-Type', 'text/javascript', false);
                method = (options.method == 'PUT' ? 'PUT' : 'POST');
                data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;
            }
        }

        return this.asyncRequest(method, uri, cb, data);
    };

    // example request
    Ext.Ajax.request({
        url: 'testrest.php',
        method: 'PUT',
        headers: {'Content-Type': 'text/xml'},
        success: function(response, opts) { Ext.Msg.alert('Sucess', 'Update has been successful'); },
        xmlData: '<blah>de</blah>'
    });

最后,还不清楚你使用的是哪个版本的Ext,上面的代码示例来自2007年。你可能需要修改你的AJAX请求,以便它使用jsonData(代替它们的xmlData)而不是使用params因为params似乎不包含在覆盖/扩展操作中。此外,论坛中的一张海报提到如果存在params,默认情况下使用POST,无论指定什么。因此,这是考虑使用jsonData的另一个原因。

如果jsonData不能满足您的需求,那么您可以始终遵循此代码示例的作者演示的示例,并修改Ext.Ajax的副本,以便在提交params时包含“PUT”请求。