Встановіть HTTP-заголовок для одного запиту


159

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

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

Але я не хочу, щоб кожен мій запит на пошту надсилав цей заголовок. Чи є спосіб надіслати заголовок лише на той запит, який я хочу? Або я повинен її видалити після мого запиту?


Відповіді:


320

В конфігураційному об’єкті, який ви передаєте, $httpдля заголовків за викликом є ​​параметр заголовків:

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

Або методом ярлика:

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

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


1
Напевно, я мав би роздивитись документа трохи ближче ... Я просто намагався використати методи швидкого доступу. Це чудово працює. Дякую.
dnc253

17
@ dnc253 Це працює і з методами швидкого доступу. Код був би$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi

1
Чи є спосіб розширити $ http (зберігаючи "ін'єкційність" і не потрібно застосовувати його до колекції заголовок за замовчуванням), щоб автоматично додати цей заголовок для вас? Здається, це зайве, що завжди потрібно додавати заголовок для кожного безпечного дзвінка, який ви здійснюєте.
nokturnal

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.