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?

dnc253
źródło

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 .

Yunchi
źródło
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');
    }

}
donny
źródło