Definir cabeçalho HTTP para uma solicitação

159

Eu tenho uma solicitação específica no meu aplicativo que requer autenticação básica, portanto, preciso definir o cabeçalho de autorização para essa solicitação. Eu li sobre como definir cabeçalhos de solicitação HTTP , mas pelo que posso dizer, ele definirá esse cabeçalho para todas as solicitações desse método. Eu tenho algo parecido com isto no meu código:

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

Mas não quero que todas as minhas solicitações de postagem enviem esse cabeçalho. Existe alguma maneira de enviar o cabeçalho apenas para a solicitação que eu quero? Ou tenho que removê-lo após o meu pedido?

dnc253
fonte

Respostas:

320

Há um parâmetro headers no objeto de configuração que você passa $httppara os cabeçalhos por chamada:

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

Ou com o método de atalho:

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

A lista dos parâmetros válidos está disponível na documentação do serviço $ http .

Yunchi
fonte
1
Acho que deveria ter examinado o documento um pouco mais de perto ... Estava apenas tentando usar os métodos de atalho. Isso funciona muito bem. Obrigado.
dnc253
17
@ dnc253 Isto também funciona com métodos de atalho. O código seria$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi
1
Existe uma maneira de estender $ http (mantendo a "injetabilidade" e sem ter que aplicá-lo à coleção de cabeçalhos padrão) para adicionar automaticamente esse cabeçalho para você? Parece meio redundante sempre ter que adicionar o cabeçalho para cada chamada segura que você faz.
Nokturnal
31
Não funciona para mim. Nenhum dos cabeçalhos que adiciono dessa forma é adicionado à solicitação real.
Mcv
4
Sempre que eu tento definir os cabeçalhos, o meu pedido sai como um OPTIONRequest, consequentemente minha endpoint retorna um 404 NOT FOUNDque faz sentido: Ele só sabe um GET /someResourcenãoOPTIONS /someResource
Matheus Felipe
19

Tente isso, talvez funcione;)

.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 verifique se o seu back-end também funciona, tente isso. Estou usando o CodeIgniter RESTful.

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
fonte