2015-04-29 18 views
34

मैं सोच रहा था कि कस्टम जानकारी जोड़ने के साथ सभी $ http अनुरोध शीर्षलेख को कॉन्फ़िगर करने का कोई तरीका है या नहीं। कॉन्फ़िगरेशन की तरह कुछ:

var config = {headers: { 
      'Authorization': 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==', 
      'Accept': 'application/json;odata=verbose' 
     } 
    }; 

लेकिन सभी $ http कॉल के लिए मैं अलग-अलग सेवाओं में कर दूंगा। मुझे यकीन है कि वहाँ एक समाधान है कर रहा हूँ: D.Thanks

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/20062493/interceptor-for-all-http-requests-in-angularjs-1- 0-x) – Julien

उत्तर

63

आप अपने हैडर का विस्तार करने के लिए एक $http इंटरसेप्टर बना सकते हैं:

myapp.factory('httpRequestInterceptor', function() { 
 
    return { 
 
    request: function (config) { 
 

 
     config.headers['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ=='; 
 
     config.headers['Accept'] = 'application/json;odata=verbose'; 
 

 
     return config; 
 
    } 
 
    }; 
 
}); 
 

 
myapp.config(function ($httpProvider) { 
 
    $httpProvider.interceptors.push('httpRequestInterceptor'); 
 
});

+0

पूछने के लिए एक मूर्ख सवाल हो सकता है, लेकिन प्राधिकरण टोकन ने "बेसिक" उपसर्ग क्यों किया है? – TheLittleNaruto

+0

यह सिर्फ एक उदाहरण है :) – alexsc

+3

@TheLittleNaruto 'प्रमाणीकरण' शीर्षलेख में कुछ मूल विकल्प हैं जैसे 'मूल आधार 64encodedStringSeperatedWithA:' या 'Bearer टोकनस्ट्रिंग' 'प्रमाणीकरण के रूप में: ' जो इंटरनेट पर मानक है। –

16

एक अधिक आसान समाधान कोणीय के run ब्लॉक का उपयोग करने से हो सकता है :

app.run(['$http', function ($http) { 
    $http.defaults.headers.common['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ=='; 
    $http.defaults.headers.common['Accept'] = 'application/json;odata=verbose'; 
}]); 

नोट: यह समाधान आपको स्थिर मूल्य पारित करने की अनुमति देता है run ब्लॉक केवल एक बार निष्पादित होने के बाद से केवल एक बार।

+6

यदि उपयोगकर्ता रन टाइम के बाद लॉग इन करता है तो उसके साथ समस्या तब तक वह प्रमाणीकरण टोकन नहीं है, इसलिए बेहतर इंटरसेप्टर – goldylucks

+0

यूप का उपयोग करें, मुझे पता है कि मैंने सवाल के अनुसार उत्तर दिया क्योंकि लेखक ** में हेडर जोड़ना चाहता था सभी ** अनुरोध :-) –

+0

मैं इसे कोणीय v1.0.6 में कोशिश कर रहा हूं लेकिन संपत्ति 'सामान्य' मौजूद नहीं है। कोई विचार? –

0
use the folllowing code and you can also control $http timeout from 
config setting.  
'use strict'; 
    var app = angular.module('b2capp', []); 
    var apiRequestCount = 0;  
    app.config(function ($httpProvider) { 
     $httpProvider.interceptors.push(function ($rootScope, $q) { 
     return { 
      request: function (config) { 
       apiRequestCount++; 
       // config.timeout =300000; 
       return config; 
      }, 
      response: function (response) { 
       return response; 
      }, 
      responseError: function (rejection) { 
      switch (rejection.status) { 
        case 408: 
         console.log('connection timed out'); 
         break; 
       } 
       // return $q.reject(rejection); 
       return rejection; 
      } 
      } 
     }) 
    }); 
}]); 
    app.controller('myCtrl', function ($scope, $http, $timeout) { 
    var headers = { 
      //'Authorization': 'Basic ' + btoa(username + ":" + password), 
       'Access-Control-Allow-Origin': true, 
       'Content-Type': 'application/json; charset=utf-8', 
       "X-Requested-With": "XMLHttpRequest" 
       } 
    $http.post(url + 'Search_6e', reqCookie, { 
        headers 
      }) 
      .then(function Success(response) {    
       $scope.myData = resultData; 
       console.log($scope.myData); 
      }, function myError(response) { 
       //error code 
    }); 
([AngularJS 1.0.x में सभी http अनुरोधों के लिए इंटरसेप्टर] की
संबंधित मुद्दे