Установить HTTP-заголовок для одного запроса

159

У меня есть один конкретный запрос в моем приложении, который требует обычной аутентификации, поэтому мне нужно установить заголовок авторизации для этого запроса. Я читал об установке заголовков HTTP-запросов , но из того, что я могу сказать, он установит этот заголовок для всех запросов этого метода. У меня есть что-то вроде этого в моем коде:

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

Но я не хочу, чтобы каждый мой запрос отправлял этот заголовок. Есть ли способ отправить заголовок только для одного запроса, который я хочу? Или я должен удалить его после моего запроса?

dnc253
источник

Ответы:

320

В объекте config, который вы передаете $httpдля заголовков вызовов, есть параметр headers:

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

Или с помощью метода ярлыков:

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

Список допустимых параметров доступен в служебной документации $ http .

Yunchi
источник
1
Думаю, мне следовало взглянуть на документ поближе ... Я просто пытался использовать ярлыки. Это прекрасно работает. Спасибо.
dnc253
17
@ dnc253 Это работает и с ярлыками. Код был бы$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Юнчи
1
Есть ли способ увеличить $ http (сохраняя «инъекцию» и не применяя его к коллекции заголовков по умолчанию), чтобы автоматически добавить этот заголовок для вас? Кажется излишним, чтобы всегда добавлять заголовок для каждого безопасного звонка, который вы делаете.
ноктюрн
31
Не работает для меня Ни один из заголовков, которые я добавляю таким образом, не добавляется к фактическому запросу.
mcv
4
Всякий раз, когда я пытаюсь установить заголовки, мой запрос отправляется как OPTIONзапрос, следовательно, моя конечная точка возвращает значение, 404 NOT FOUNDкоторое имеет смысл: оно знает только GET /someResourceнеOPTIONS /someResource
Матеус Фелипе
19

Попробуйте это, возможно, это работает;)

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

И убедитесь, что ваш сервер тоже работает, попробуйте это. Я использую 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');
    }

}
Донни
источник