1

我正在編寫Angular中的攔截器來處理404響應。當請求來自REST服務時,攔截器不能攔截請求。我的主要問題是區分請求來自頁面請求還是來自REST服務請求。目前,我在使用rejection.config.url中的URL並測試我的REST URL服務是否與該值匹配。雖然這種方法行得通,但我認爲這不是一個好的解決方案。有沒有其他方法或更好的方法來做到這一點?從角度攔截器中的正常請求中區分404 Rest服務

攔截代碼:

angular.module("mainApp").factory("notFoundInterceptor",['$q','$location','$rootScope', function ($q,$location,$rootScope) { 
return { 
    responseError: function (rejection) { 
     function isURLFromRESTService(rejection) { 
      var url = /myresturl/; //pattern used to match REST URL 
      return url.test(rejection.config.url); 
     } 

     if (rejection.status === 404 and !isURLFromRESTService(rejection)) { // Not found 
       $rootScope.notFound = { 
        erro: 'Não possível encontrar: ' + $location.url() 
       } 
       $location.path('/notfound'); 
     } 

     return $q.reject(rejection); 
    } 
};}]); 
+0

請求的URL可用作response.config.url。 – georgeawg

+0

是的,@georgeawg。你是對的。我使用'response.config.url'value來處理請求來自何時REST服務。我正在尋找URL中的模式。但我認爲這不是一個最好的解決方案。 –

+0

更直接的方法是在一個AngularJS服務中放置一個'.catch'處理程序,該服務向服務器上的REST API發出$ http請求。 – georgeawg

回答

3

這裏是一個另類:不能說,如果它能夠更好與否: - | ...您決定:)

當你調用你的REST API,通過配置對象與像一個標誌:

$http.get('REST API URL', { ignore404: true }) 

現在在你的攔截器,您可以檢查,如:

if (rejection.status === 404 && !rejection.config.ignore404) { 
    $rootScope.notFound = { 
     erro: 'Não possível encontrar: ' + $location.url() 
    } 
    $location.path('/notfound'); 
} 

當然,您將需要爲每個REST API調用傳遞此配置對象。

對於您可能需要編寫自己的包裝上$http,增加了配置對象(或只是如果config對象是從外面通過添加ignore404屬性),並同時調用你的REST API的使用地點$http此服務。