Ben servis DİNLENME prensibini takip eder ve başarısız operasyonlar için 2xx
dışındaki HTTP durum kodlarını kullanır varsayalım. Ancak, Ext 2xx
durumuna dönmeyen yanıtlar için yanıt gövdesini değil yanıt gövdesi ayrıştırır. İstisna/yanıt nesnesi (yani 'istisna' olay dinleyicilerine geçirilir) gibi durumlarda sağlamaz response.statusText
sadece HTTP durum mesajı nedir .
nedenle kendini JSON için responseText ayrıştırmak zorunda kalacaktır. Tek bir çizgi ile başarılabileceğinden, bu gerçekten sorun değil.
var data = Ext.decode(response.responseText);
sizin kodlama stili bağlı olarak da 'beklenen' ve 'beklenmedik' HTTP hata durum kodları arasında bazı hata işleme ekleme ve/veya ayırt etmek isteyebilirsiniz. Bu davranışın nedeni, çünkü DİNLENME vekil sınıf veri paketindeki birinci sınıf üyesi olmama muhtemelen
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;
},
(Bu Ext.data.reader.Json dan). HTTP durum kodlarını yalnızca haberleşme kanalı hataları için kullanan standart AJAX (veya JsonP) proxy davranışını da tanımlayan ortak bir taban sınıfından türetilmiştir. Bu nedenle, bu gibi durumlarda sunucudan ayrılabilir bir mesaj beklemezler. Uygulama hatalarını gösteren Sunucu yanıtları yerine Tamam HTTP durumu ve (success:"false"
ve message:"[your error message]"
ile) Söz ilan edilen bir JSON yanıtı ile iade edilmesi bekleniyor.
İlginç REST sunucusu olmayan bir 2xx durum ve bir yanıt gövdesinde (Ext açısından) geçerli bir JSON yanıt ile ve 'gerçek' olarak ayarlanır başarı özelliğiyle bir yanıt geri dönebilirler. Özel durum olayı yine de kovulur ve yanıt gövdesi ayrıştırılmamış olur. Bu kurulum pek bir anlam ifade etmiyor - sadece 'başarı' arasındaki farkın, vücuttaki başarı özelliğiyle karşılaştırıldığında (durumun ilkine göre önceliği olan), HTTP durum kodu açısından dikkat çekmek istiyorum.
Eğer uzatmak (veya geçersiz) olabilecek bir daha şeffaf çözüm için
Güncelleme Ext.data.proxy.Rest: Bu true
için false
gelen başarı değerini değiştirmek ve daha sonra standart processResponse uygulanmasını arayacak. Bu 'standart' Ext davranışını taklit eder ve responseText'i ayrıştırır. Elbette bu, orijinal yayınınızda success:"false"
(veya başka bir şekilde başarısız) ile belirtildiği gibi standart bir JSON yanıtı bekleyecektir. Bu, test edilmemiş olsa da ve eğer ifade muhtemelen daha akıllı olmalıdır.
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);
}
}
})
Süper!Mükemmel çalışır, detaylı açıklama için teşekkür ederim! : -D – Dae
Sonunda basit Ajax API'sı lehine REST'i bıraktım. İşte yanıt mesajı işleme için son kodum: http://pastie.org/2657317 – Dae
Bu harika bir açıklama ... Sencha bunu kendi dokümanlarına eklemeli! – HDave