Ustaw nagłówek HTTP dla jednego żądania


159

Mam jedno konkretne żądanie w mojej aplikacji, które wymaga uwierzytelniania podstawowego, więc muszę ustawić nagłówek autoryzacji dla tego żądania. Czytałem o ustawianiu nagłówków żądań HTTP , ale z tego, co wiem, ustawi ten nagłówek dla wszystkich żądań tej metody. Mam coś takiego w swoim kodzie:

$http.defaults.headers.post.Authorization = "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==";

Ale nie chcę, aby każdy mój post wysyłał ten nagłówek. Czy istnieje sposób na wysłanie nagłówka tylko dla jednego żądania, które chcę? Czy muszę go usunąć po moim zgłoszeniu?


Odpowiedzi:


320

W obiekcie konfiguracyjnym, do którego przekazujesz $httpnagłówki dla poszczególnych wywołań, znajduje się parametr headers:

$http({method: 'GET', url: 'www.google.com/someapi', headers: {
    'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
});

Lub metodą skrótową:

$http.get('www.google.com/someapi', {
    headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
});

Lista ważnych parametrów jest dostępna w dokumentacji serwisowej $ http .


1
Myślę, że powinienem był przyjrzeć się doktorowi trochę bliżej ... Właśnie próbowałem użyć metod skrótów. To działa świetnie. Dzięki.
— dnc253,

17
@ dnc253 Działa to również z metodami skrótów. Kod $http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
— brzmiałby

1
Czy istnieje sposób na rozszerzenie $ http (zachowując „możliwość wstrzykiwania” i bez konieczności stosowania go do domyślnej kolekcji nagłówków), aby automatycznie dodać ten nagłówek za Ciebie? Wydaje się trochę zbędne, aby zawsze dodawać nagłówek do każdego bezpiecznego połączenia, które wykonujesz.
— nokturnal,

31
Nie działa na mnie. Żaden z nagłówków, które dodam w ten sposób, nie zostanie dodany do rzeczywistego żądania.
— mcv

4
Ilekroć próbuję ustawić nagłówki, moja prośba wychodzi jako OPTIONżądanie, w konsekwencji mój końcowy zwraca 404 NOT FOUNDktóry ma sens: To tylko wie GET /someResourcenieOPTIONS /someResource
— Matheus Felipe

19

Spróbuj tego, być może zadziała;)

.factory('authInterceptor', function($location, $q, $window) {


return {
    request: function(config) {
      config.headers = config.headers || {};

      config.headers.Authorization = 'xxxx-xxxx';

      return config;
    }
  };
})

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

I upewnij się, że twój backend też działa, spróbuj tego. Używam RESTful CodeIgniter.

class App extends REST_Controller {
    var $authorization = null;

    public function __construct()
    {
        parent::__construct();
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Authorization");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
        if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) {
            die();
        }

        if(!$this->input->get_request_header('Authorization')){
            $this->response(null, 400);    
        }

        $this->authorization = $this->input->get_request_header('Authorization');
    }

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.