2

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

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

所以我决定从 servlet 获取请求参数。所以我用过

request.getParameter("json")

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

4

1 回答 1

1

来自Ext.Ajax 4.1 文档

method : String 用于请求的默认 HTTP 方法。请注意,这是区分大小写的并且应该全部大写(如果未设置但参数存在将使用“POST”,否则将使用“GET”。)

该文档没有提到允许 PUT,但也没有提到不允许 PUT。

此外,还有说明如何使用HTTP 方法覆盖来使 servlet 调用映射到 PUT 或 DELETE 的服务的文档。

有人建议使用 HTTP Method Override 而不是直接使用 PUT 或 DELETE,再加上 Ext.Ajax 文档省略了其他 HTTP Method 选项,这一事实强烈表明您尝试使用 Ext 是不可能的。

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

但是,利用 JavaScript 的动态类型和功能特性,可以使用来自此论坛帖子的代码轻松覆盖/扩展默认 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似乎没有包含在覆盖/扩展操作中。此外,论坛中的一位发帖人提到,如果存在参数,则默认使用 POST,无论指定什么。因此,这是另一个考虑使用 jsonData 的原因。

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

于 2012-05-23T07:01:28.567 回答