Définir l'en-tête HTTP pour une demande

159

J'ai une demande particulière dans mon application qui nécessite une authentification de base, je dois donc définir l'en-tête d'autorisation pour cette demande. J'ai lu sur la définition des en-têtes de requête HTTP , mais d'après ce que je peux dire, cela définira cet en-tête pour toutes les demandes de cette méthode. J'ai quelque chose comme ça dans mon code:

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

Mais je ne veux pas que chacune de mes demandes de publication envoie cet en-tête. Existe-t-il un moyen d'envoyer l'en-tête uniquement pour la demande que je souhaite? Ou dois-je le supprimer après ma demande?

dnc253
la source

Réponses:

320

Il y a un paramètre headers dans l'objet de configuration auquel vous passez $httppour les en-têtes par appel:

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

Ou avec la méthode des raccourcis:

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

La liste des paramètres valides est disponible dans la documentation du service $ http .

Yunchi
la source
1
J'imagine que j'aurais dû regarder le document un peu plus près ... J'essayais juste d'utiliser les méthodes de raccourci. Cela fonctionne très bien. Merci.
dnc253
17
@ dnc253 Cela fonctionne également avec les méthodes de raccourci. Le code serait$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi
1
Existe-t-il un moyen d'étendre $ http (tout en conservant «l'injectabilité» et sans devoir l'appliquer à la collection d'en-têtes par défaut) pour ajouter automatiquement cet en-tête pour vous? Cela semble un peu redondant de devoir toujours ajouter l'en-tête pour chaque appel sécurisé que vous passez.
nokturnal
31
Ça ne marche pas pour moi. Aucun des en-têtes que j'ajoute de cette manière n'est ajouté à la requête réelle.
mcv
4
Chaque fois que j'essaye de définir les en-têtes, ma demande sort en tant que OPTIONrequête, par conséquent mon point de terminaison renvoie un 404 NOT FOUNDqui a du sens: il ne connaît qu'un GET /someResourcenonOPTIONS /someResource
Matheus Felipe
19

Essayez ceci, peut-être que cela fonctionne;)

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

Et assurez-vous que votre back-end fonctionne aussi, essayez ceci. J'utilise 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
la source