Imposta l'intestazione HTTP per una richiesta


159

Ho una richiesta particolare nella mia app che richiede l'autenticazione di base, quindi devo impostare l'intestazione di autorizzazione per quella richiesta. Ho letto sull'impostazione delle intestazioni delle richieste HTTP , ma da quello che posso dire, imposterà quell'intestazione per tutte le richieste di quel metodo. Ho qualcosa di simile nel mio codice:

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

Ma non voglio che ognuna delle mie richieste di post invii questa intestazione. Esiste un modo per inviare l'intestazione solo per la richiesta che desidero? O devo rimuoverlo dopo la mia richiesta?


Risposte:


320

Esiste un parametro headers nell'oggetto config a cui si passa $httpper le intestazioni per chiamata:

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

O con il metodo di scelta rapida:

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

L'elenco dei parametri validi è disponibile nella documentazione del servizio $ http .


1
Immagino che avrei dovuto esaminare il documento un po 'più da vicino ... Stavo solo cercando di usare i metodi di scelta rapida. Funziona benissimo. Grazie.
dnc253,

17
@ dnc253 Funziona anche con metodi di scelta rapida. Il codice sarebbe$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi il

1
C'è un modo per estendere $ http (mantenendo al contempo "iniettabilità" e non doverlo applicare alla raccolta di intestazioni predefinita) per aggiungere automaticamente questa intestazione? Sembra ridondante dover aggiungere sempre l'intestazione per ogni chiamata sicura effettuata.
notte del

31
Non funziona per me. Nessuna delle intestazioni che aggiungo in questo modo viene aggiunta alla richiesta effettiva.
mcv,

4
Ogni volta che provo a impostare le intestazioni, la mia richiesta viene emessa come OPTIONRichiesta, di conseguenza il mio endpoint restituisce un 404 NOT FOUNDsenso che ha senso: conosce solo un GET /someResourcenonOPTIONS /someResource
Matheus Felipe

19

Prova questo, forse funziona;)

.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');
})

E assicurati che anche il tuo back-end funzioni, prova questo. Sto usando 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');
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.