2011-09-25 17 views
17

ExtJs 4のRESTFul Store exampleをビルドしています。追加または削除リクエストが失敗した場合、RESTサーバーが提供するエラーをスクリプトに表示したいです。私はリクエストの成功状況を取得することができましたが(下記のコードを参照してください)、レスポンスとともに提供されるメッセージにはどのように連絡しますか?ExtJs 4でREST応答メッセージを取得する方法は?

ストア:

var store = Ext.create('Ext.data.Store', { 
    model: 'Users', 
    autoLoad: true, 
    autoSync: true, 
    proxy: { 
     type: 'rest', 
     url: 'test.php', 
     reader: { 
      type: 'json', 
      root: 'data', 
      model: 'Users' 
     }, 
     writer: { 
      type: 'json' 
     }, 
     afterRequest: function(request, success) { 
      console.log(success); // either true or false 
     }, 
     listeners: { 
      exception: function(proxy, response, options) { 

       // response contains responseText, which has the message 
       // but in unparsed Json (see below) - so I think 
       // there should be a better way to reach it than 
       // parse it myself 

       console.log(proxy, response, options); 
      } 
     } 
    } 
}); 

典型的なRESTの応答:

"{"success":false,"data":"","message":"VERBOSE ERROR"}" 

はおそらく、私はそれがすべて間違ってやっているので、何かアドバイスは歓迎です。

答えて

25

あなたのサービスはRESTの原則に従い、失敗した操作のために2xx以外のHTTPステータスコードを使用しているとします。 ただし、Extはではありません。ステータスを返さないレスポンス本文を解析します。OK 2xxが提供する例外/応答オブジェクト(「例外」イベントリスナーに渡されるもの)は、response.statusTextというHTTPステータスメッセージのみです。

したがって、responseTextを自分でJSONに解析する必要があります。これは実際には問題にはならないが、これは1行で実現できるからだ。

var data = Ext.decode(response.responseText); 

はあなたのコーディングスタイルに応じて、あなたはまた、「期待」と「予期しない」HTTPエラーステータスコードの間でいくつかのエラー処理を追加し、および/または区別したい場合があります。

getResponseData: function(response) { 
    try { 
     var data = Ext.decode(response.responseText); 
    } 
    catch (ex) { 
     Ext.Error.raise({ 
      response: response, 
      json: response.responseText, 
      parseError: ex, 
      msg: 'Unable to parse the JSON returned by the server: ' + ex.toString() 
     }); 
    } 

    return data; 
}, 

(これはExt.data.reader.Jsonからです)この現象の理由は、RESTプロキシクラスは、データパッケージの最初のクラスのメンバーではないのでしょうです。これは、共通の基本クラスから派生し、通信チャネルエラーに対してのみHTTPステータスコードを使用する標準AJAX(またはJsonP)プロキシの動作も定義します。したがって、そのような場合には、サーバーから解析可能なメッセージは期待されません。 代わりに、アプリケーションのエラーを示すサーバーの応答は、HTTPステータスOKで返されると予想され、質問に投稿されたJSON応答(success:"false"message:"[your error message]")が返されます。

興味深いことに、RESTサーバーは、2xx以外のステータスのレスポンスと、有効なJSON応答(Ext条件で)とsuccessプロパティが 'true'のレスポンス本文を返すことができます。例外イベントは引き続き発生し、応答本体は解析されません。 この設定はあまり意味がありません。私は、HTTPステータスコードの点で、bodyのsuccessプロパティ(最初のものが後者よりも優先されます)と比較して '成功'の違いを指摘したいだけです。

あなたは拡張(または上書き)可能性があり、より透明の溶液については

更新Ext.data.proxy.Rest:これはtruefalseから成功値を変更して、標準processResponse実装を呼び出します。これは、 '標準的な' Extの動作をエミュレートし、responseTextを解析します。もちろんこれは、success:"false"で元の投稿に記載されている標準JSONレスポンスを期待します(そうでなければ失敗します)。 これはテストされていませんが、if式はもっとスマートになるはずです。

Ext.define('Ext.ux.data.proxy.Rest', { 
    extend: 'Ext.data.proxy.Rest', 

    processResponse: function(success, operation, request, response, callback, scope){ 
     if(!success && typeof response.responseText === 'string') { // we could do a regex match here 
      var args = Array.prototype.slice.call(arguments); 
      args[0] = true; 
      this.callParent(args); 
     } else { 
      this.callParent(arguments); 
     } 
    } 
}) 
+0

スーパー!完全に動作します、詳細な説明をありがとう! :-D – Dae

+0

最終的に私はシンプルなAjax APIに賛成してRESTをあきらめました。ここに私の最終的な応答メッセージ処理コードがあります:http://pastie.org/2657317 – Dae

+0

これは素晴らしい説明です...賢者はドキュメントにこれを追加する必要があります! – HDave

関連する問題