Establecer encabezado HTTP para una solicitud

159

Tengo una solicitud particular en mi aplicación que requiere autenticación básica, por lo que necesito configurar el encabezado de autorización para esa solicitud. Leí sobre la configuración de encabezados de solicitud HTTP , pero por lo que puedo decir, establecerá ese encabezado para todas las solicitudes de ese método. Tengo algo como esto en mi código:

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

Pero no quiero que todas mis solicitudes de publicación envíen este encabezado. ¿Hay alguna forma de enviar el encabezado solo para la solicitud que deseo? ¿O tengo que eliminarlo después de mi solicitud?

dnc253
fuente

Respuestas:

320

Hay un parámetro de encabezado en el objeto de configuración al que pasa $httppara los encabezados por llamada:

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

O con el método de acceso directo:

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

La lista de los parámetros válidos está disponible en la documentación del servicio $ http .

Yunchi
fuente
1
Supongo que debería haber mirado el documento un poco más de cerca ... Solo estaba tratando de usar los métodos de acceso directo. Esto funciona muy bien. Gracias.
dnc253
17
@ dnc253 Esto también funciona con métodos de acceso directo. El código sería$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi, el
1
¿Hay alguna manera de extender $ http (mientras se mantiene la "inyectabilidad" y no tener que aplicarlo a la colección de encabezados predeterminada) para agregar automáticamente este encabezado por usted? Parece un poco redundante tener que agregar siempre el encabezado para cada llamada segura que realice.
nokturnal
31
No funciona para mi Ninguno de los encabezados que agrego de esta manera se agrega a la solicitud real.
mcv
44
Cada vez que intento configurar los encabezados, mi solicitud sale como una OPTIONSolicitud, por lo tanto, mi punto final devuelve un 404 NOT FOUNDque tiene sentido: solo sabe un GET /someResourcenoOPTIONS /someResource
Matheus Felipe
19

Prueba esto, tal vez 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');
})

Y asegúrese de que su back-end también funcione, intente esto. Estoy 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');
    }

}
donny
fuente