2

ExtJSを使用してAJAXリクエストを実行しています。これが私のコードです

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

そこで、サーブレットからリクエストパラメータを取得することにしました。だから私は使用しました

request.getParameter("json")

しかし、代わりにnull値を取得します。POSTメソッドを使用した場合はうまく機能しますが、PUTは使用できません。PUTメソッドを使用しているときにサーブレットでリクエストパラメータを取得する他の方法はありますか?

4

1 に答える 1

1

Ext.Ajax 4.1ドキュメントから:

method:Stringリクエストに使用されるデフォルトのHTTPメソッド。これは大文字と小文字が区別され、すべて大文字にする必要があることに注意してください(設定されていないがパラメータが存在する場合は「POST」を使用し、そうでない場合は「GET」を使用します)。

ドキュメントには、PUTの許可については言及されていませんが、PUTの禁止についても言及されていません。

さらに、HTTPメソッドオーバーライドを使用してサーブレットにPUTまたはDELETEにマップされたサービスを呼び出させる方法を説明するドキュメントがあります。

誰かが単にPUTまたはDELETEを直接使用する代わりにHTTPメソッドオーバーライドを使用することを提案し、他のHTTPメソッドオプションを省略したExt.Ajaxドキュメントと組み合わせて、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年のものです。paramsをparamsとして使用する代わりにjsonData(xmlDataの代わりに)を使用するようにAJAXリクエストを変更する必要がある場合がありますオーバーライド/拡張​​操作に含まれていないようです。さらに、フォーラムの投稿者の1人は、パラメータが存在する場合、何が指定されているかに関係なく、デフォルトでPOSTが使用されると述べています。したがって、これは、代わりにjsonDataの使用を検討するもう1つの理由です。

jsonDataがニーズを満たさない場合は、このコード例の作成者が示した例に従い、パラメータが送信されたときに「PUT」リクエストが含まれるようにExt.Ajaxのコピーを変更できます。

于 2012-05-23T07:01:28.567 に答える