2013-10-29 19 views
12

(400 & 500 hataları gibi) bir hata yanıtını döndüren bir yöntemden arıyorum, ancak AngularJS hata geri dönmem istenmiyor ve Durum kodumun 400 veya 500'leri içermesine rağmen, her zaman başarı geri çağrısı çağrılıyor. Birisi neyi yanlış yaptığımı söyleyebilir mi?

angularjs kodu: Aşağıdaki açısal & WebAPI kodunu bakınız

$http.get("/api/employee") 
    .success(function (data, status, headers, config) { 
     console.log(data); 
     return data; 
    }).error(function (data, status, headers, config) { 
     alert("error"); 
     return status; 
}); 

Web API kodu:

public HttpResponseMessage Get(EmployeeModel employee) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
    } 
    //some other code 
} 
+1

Tarayıcının ağ sekmesindeki yanıtın durumunu kontrol edebilirsiniz –

+1

JavaScript'iniz "GET" yi çağırıyor, ancak "PUT" için kod yazdınız. Neler olup bittiğini görmek için tarayıcı hata ayıklama araçlarını veya Fiddler'ı kullanın. –

+0

Üzgünüz bir yazım hatası. Ayrıca, geri aldığım yanıt budur: HTTP/1.1 400 Hatalı İstek Önbellek Denetimi: önbellek yok Pragma: no-cache Son İşlemler: -1 Sunucu: Microsoft-IIS/8.0 X-AspNet- Sürüm: 4.0.30319 X-Kaynak Kodlarını: = UTF-8 B RDpcU2hhblxDb25zdHJ1Y3Rpb25XZWJBcGlcQ29uc3RydWN0aW9uV2ViQXBpXGFwaVxzdXBwbGllcg == = X-Powered-By:???? ASP.NET Tarih: Sal, 29 Ekim 2013 21:21:18 GMT İçerik- Uzunluk: 0 – user972255

cevap

1

Ben .success ve .error seçeneklerle şans olduğunu ve kullanma sona erdi asla her şey için .ve henüz bir sorunum yok. Ayrıca, yapmaya çalıştığınız bir sözden değer veremeyeceğinizi de belirtmeliyim. Sözü girmeden önce değişkenli bir değişken bildirmeniz veya söz konusu tutarda yeni bir kapsam değişkenini atamanız gerekir. hataların giderilmesine yönelik merkezi bir yöntem zamanlarda yararlı olabilir sahip Ayrıca

var employees = $http({method:'GET', url:'/api/employee'); 
employees.then(function(data){ 
    $scope.employeeData = data; 
}, function(data){ 
    //do error handling here 
}); 

ve burada ayrıntılı olarak ki (bir httpInterceptor kullanılarak yapılabilir:

Yani, bu değişikliklerle kod aşağıdaki gibi görünecektir : Handle HTTP 302 response from proxy in angularjs). Bunu yapmak, yapılacak başka bir hata işleminin olmaması durumunda, bu durumda ikinci işlevi tamamen kaldırmanızı sağlar, böylece kod ve bant genişliği kaydedilir.

6

Aynı problemi yaşadım ve hala bunu kendim çözüyorum ama olası bir problem tespit ettim.

.error() geri

( $httpProvider.interceptors dizisine eklenerek kayıtlı) HTTP yanıtı intercepter ile, yürütülmesi önlenebilir.

Ben ekleyerek önleme uçak bir modül kullanılarak, ve bu yüzden bu çıkarılıp elle şeyler yazdım.

+0

Merak ediyorum, ** Restangular ** kullanıyordunuz? Ben 'addResponseInterceptor' yöntemini kullanıyorum, ama' $ http' hizmetinin engelleyicileri ile uğraşmaktan emin değilim. Ertelenmiş nesneyi boşuna geri çevirmeyi denedim, fakat * hata * engelleyicide ('setErrorInterceptor''dan) potansiyel olduğunu düşünüyorum, çünkü doğrudan $ için kullanılmayan Restangular uygulamasına rağmen $ http' için hataları ele alıyor gibi görünüyor. söz konusu çağrı. – cloudrave

+0

Restangular –

+0

Kullanmıyordum Matthias. Bu sorun, bir nedenle sadece 500 hata ile ortaya çıktı. Henüz anlamadım ama Restangular'ın suçlu olduğunu düşünmüyorum. – cloudrave

1

Her bir HTTP isteğinin gecikmesini yakalamak ve aynı sorunla karşılaşmak için bir önleme oluşturmuştum. Çözüm çok basitti. Sadece değiştirin: dönüş cevabı; dönüş $ q.reject (response) ile;. Örnek:

SCM.service('httpService', function($q) { 
    this.request = function(config) { 
     if (angular.isObject(config)) { 
      config.delay = new Date().getTime(); 
     } 
     return config; 
    }; 
    this.requestError = function(config) { 
     if (angular.isObject(config)) { 
      config.delay = new Date().getTime(); 
     } 
     return $q.reject(config); 
    }; 
    this.response = function(response) { 
     if (angular.isObject(response.config)) { 
      response.config.delay = new Date().getTime() - response.config.delay; 
     } 
     return response; 
    }; 
    this.responseError = function(response) { 
     if (angular.isObject(response.config)) { 
      response.config.delay = new Date().getTime() - response.config.delay; 
     } 
     return $q.reject(response); 
    }; 
}); 

SCM.config(function($httpProvider) { 
    $httpProvider.interceptors.push('httpService'); 
}); 
16

sorun doğru hata yaymak olmayan bir önleme, sahip. Eğer bir ara kesicinin yanıtı verildiyse, çağrı yığınının istisnasını çoğaltması gerekir, bu nedenle aşağıdaki işlev çağrıları/geri çağrıları, başarılı bir yanıt gelmeyecek bir hata olduğunu bilir.

$httpProvider.interceptors.push(function ($q, $rootScope) { 
 

 
     return { 
 
      request: function (config) { 
 
       //the same config/modified config/a new config needs to be returned. 
 
       return config; 
 
      }, 
 
      requestError: function (rejection) { 
 
       return $q.reject(rejection); 
 
      }, 
 
      response: function (response) { 
 
       //the same response/modified/or a new one need to be returned. 
 
       return response; 
 
      }, 
 
      responseError: function (rejection) { 
 
       return $q.reject(rejection); 
 
      } 
 
     }; 
 
    });

Matthias belirtilen bu nokta

doğrudur, fakat bu dönüş elemanı yoktur. Dolayısıyla, responseError'da reddederseniz, işe yaramazsa reddetmeyi geri göndermeniz gerekir, böylece aşağıdaki öğeler bildirilir.

+0

Bu doğru, bu benim sorunumu çözdü. – scokmen

İlgili konular