2011-09-25 13 views
17

मैं एक्स्टजेस 4 के RESTFul Store example पर निर्माण कर रहा हूं। मैं अपनी स्क्रिप्ट को आरईएसटी सर्वर द्वारा प्रदान की गई त्रुटियों को प्रदर्शित करना चाहता हूं, जब या तो अनुरोध जोड़ें या हटाएं विफल हो जाए। मैंने अनुरोध की सफलता की स्थिति प्राप्त करने में कामयाब रहा है (नीचे दिए गए कोड को देखें), लेकिन मैं प्रतिक्रिया के साथ दिए गए संदेश तक कैसे पहुंचूं?ExtJs 4 में आरईएसटी प्रतिक्रिया संदेश कैसे प्राप्त करें?

स्टोर:

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); 
      } 
     } 
    } 
}); 

ठेठ बाकी प्रतिक्रिया:

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

शायद मैं यह सब गलत कर रही है, इसलिए किसी भी सलाह की सराहना की है।

उत्तर

25

मुझे लगता है कि आपकी सेवा आरईएसटी सिद्धांत का पालन करती है और असफल संचालन के लिए 2xx के अलावा HTTP स्थिति कोड का उपयोग करती है। हालांकि, Ext उन प्रतिक्रियाओं के लिए प्रतिक्रिया निकाय को पार्स नहीं करता है जो स्थिति ठीक नहीं करते हैं 2xx। अपवाद/प्रतिक्रिया ऑब्जेक्ट (जिसे 'अपवाद' ईवेंट श्रोताओं को पास किया जाता है) ऐसे मामलों में प्रदान करता है केवल response.statusText में HTTP स्थिति संदेश है।

इसलिए आपको JSON को प्रतिक्रिया पाठ को पार्स करना होगा। जो वास्तव में एक समस्या नहीं है क्योंकि इसे एक लाइन के साथ पूरा किया जा सकता है।

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 से है) इस व्यवहार के लिए कारण शायद इसलिए है क्योंकि बाकी प्रॉक्सी वर्ग डेटा पैकेज में एक प्रथम श्रेणी के सदस्य नहीं होने का है। यह एक सामान्य बेस क्लास से लिया गया है जो मानक AJAX (या JsonP) प्रॉक्सी के व्यवहार को भी परिभाषित करता है जो केवल संचार चैनल त्रुटियों के लिए HTTP स्थिति कोड का उपयोग करता है। इसलिए वे ऐसे मामलों में सर्वर से किसी भी पार्सेबल संदेश की अपेक्षा नहीं करते हैं। सर्वर त्रुटियों को इंगित करने के लिए सर्वर त्रुटियों को HTTP स्थिति ठीक से वापस करने की उम्मीद है, और आपके प्रश्न में पोस्ट की गई JSON प्रतिक्रिया (success:"false" और message:"[your error message]" के साथ)।

दिलचस्प बात यह है कि एक आरईएसटी सर्वर एक गैर-2xx स्थिति और एक वैध जेएसओएन प्रतिक्रिया (अतिरिक्त शर्तों में) के साथ एक प्रतिक्रिया निकाय और सफलता संपत्ति 'सत्य' पर प्रतिक्रिया दे सकता है। अपवाद घटना अभी भी निकाल दी जाएगी और प्रतिक्रिया निकाय को पार्स नहीं किया जाएगा। यह सेटअप बहुत समझ में नहीं आता है - मैं बस शरीर में सफलता संपत्ति की तुलना में HTTP स्थिति कोड के संदर्भ में 'सफलता' के बीच अंतर को इंगित करना चाहता हूं (बाद में पहले की प्राथमिकता के साथ)।

अद्यतन

ज्यादा पारदर्शी समाधान आप का विस्तार कर सकता है (या ओवरराइड) के लिए Ext.data.proxy.Rest: इस true को false से सफलता मूल्य बदल जाएगा और उसके बाद मानक processResponse कार्यान्वयन कहते हैं। यह 'मानक' एक्स व्यवहार का अनुकरण करेगा और प्रतिक्रिया पाठ को पार्स करेगा। बेशक यह success:"false" (या अन्यथा असफल) के साथ आपकी मूल पोस्ट में उल्लिखित मानक JSON प्रतिक्रिया की अपेक्षा करेगा। हालांकि यह अनचाहे है, और अगर अभिव्यक्ति शायद चालाक हो।

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

सुपर!पूरी तरह से काम करता है, विस्तृत स्पष्टीकरण के लिए धन्यवाद! :- डी – Dae

+0

आखिरकार मैंने सरल अजाक्स एपीआई के पक्ष में आरईएसटी छोड़ दिया। प्रतिक्रिया संदेश प्रसंस्करण के लिए मेरा अंतिम कोड यहां दिया गया है: http://pastie.org/2657317 – Dae

+0

मैन यह एक महान स्पष्टीकरण है ... सेन्चा को इसे अपने दस्तावेज़ों में जोड़ना होगा! – HDave

संबंधित मुद्दे