Как читать заголовки ответов в angularjs?

Мой сервер возвращает такой заголовок: Content-Range:0-10/0:

введите здесь описание изображения

Я безуспешно пытался прочитать этот заголовок в angular:

var promise = $http.get(url, {
    params: query
}).then(function(response) {
  console.log(response.headers());
  return response.data;
});

который просто печатает

Object {content-type: "application/json; charset=utf-8"}

Любые идеи, как получить доступ к заголовку диапазона содержимого?


person Upvote    schedule 02.03.2015    source источник


Ответы (7)


Используйте переменную headers в обратных вызовах успеха и ошибки

Из документации.

$http.get('/someUrl').
  success(function(data, status, headers, config) {
    // this callback will be called asynchronously
    // when the response is available
  })
  .error(function(data, status, headers, config) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });

Если вы находитесь в том же домене, вы сможете получить обратно заголовки ответа. Если междоменный, вам нужно будет добавить заголовок Access-Control-Expose-Headers на сервер.

Access-Control-Expose-Headers: content-type, cache, ...
person Muhammad Reda    schedule 02.03.2015
comment
Это по-прежнему не дает мне заголовки ответа, только заголовки запроса. - person Upvote; 02.03.2015
comment
У меня уже включен междоменный доступ. На снимке экрана в моем вопросе показано, что заголовок диапазона содержимого находится внутри ответа в инспекторе Chrome. Так что проблема не в сервере. - person Upvote; 02.03.2015
comment
Да, CORS по умолчанию возвращает определенные заголовки. И вам нужно указать, какие другие заголовки можно безопасно открывать через API. см. это. - person Muhammad Reda; 30.03.2015
comment
Вызов успеха кажется устаревшим и не должен использоваться. Проверьте документы: docs.angularjs.org/api/ng/service/$http - person Vitalij; 21.06.2016
comment
будет ли работать получение set-cookie (с флагом httponly) из заголовка ответа? - person jay rangras; 15.06.2021

Почему бы просто не попробовать это:

var promise = $http.get(url, {
    params: query
}).then(function(response) {
  console.log('Content-Range: ' + response.headers('Content-Range'));
  return response.data;
});

Особенно, если вы хотите вернуть promise, чтобы он мог быть частью цепочки обещаний.

person Eugene Retunsky    schedule 07.05.2016
comment
Даю (+1), потому что response имеет метод headers(), который принимает параметр name. Это моя проблема, хотя; Я не могу получить заголовок Authorization [или любой другой] через response.headers('Authorization'), даже когда я вижу response.config.headers['Authorization'] на виду!!! Для чего тогда эта функция??? - person Cody; 10.06.2016
comment
Это междоменный запрос? - person Eugene Retunsky; 14.06.2016
comment
Вероятно, вам не следует работать с авторизацией A‌​в одном запросе, подобном этому. Используйте перехватчик для авторизации - person Jens Alenius; 16.08.2016
comment
@EugeneRetunsky: у меня междоменный запрос. Я вижу заголовок авторизации в ответ, но теперь могу его получить. В любом случае я могу это сделать, поскольку API возвращает токен для успешной аутентификации. - person Bhargav Bhanderi; 23.03.2017
comment
я получаю заголовки, это не функция - person sports; 21.06.2018
comment
Authorization — это общий заголовок запроса. Я никогда не видел его как заголовок ответа. Вы уверены, что это на самом деле в вашем ответе? response.config.headers может относиться к запросу, а не к ответу. - person Brandon; 04.11.2019

Обновлено на основе ответа Мухаммеда...

$http.get('/someUrl').
  success(function(data, status, headers, config) {
    // this callback will be called asynchronously
    // when the response is available
    console.log(headers()['Content-Range']);
  })
  .error(function(data, status, headers, config) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
  });
person medoix    schedule 15.02.2016

В дополнение к ответу Евгения Ретунского, цитируя документацию https://docs.angularjs.org/api/ng/service/$http относительно ответа:

Объект ответа имеет следующие свойства:

  • данные{string|Object} — тело ответа, преобразованное с помощью функций преобразования.

  • статус{number} — код состояния HTTP ответа.

  • заголовки{function([headerName])} — функция получения заголовков.

  • config{Object} — объект конфигурации, который использовался для создания запроса.

  • statusText{string} — текст состояния HTTP ответа.

Обратите внимание, что порядок обратного вызова аргументов для $resource (v1.6) < strong>не то же самое, что и выше:

Обратный вызов успеха вызывается с аргументами (value (Object|Array), responseHeaders (Function), status (number), statusText (string)), где значением является заполненный экземпляр ресурса или объект коллекции. Обратный вызов ошибки вызывается с аргументом (httpResponse).

person Wtower    schedule 17.12.2016

response.headers();

даст вам все заголовки (по умолчанию и таможня). работал на меня !!

введите здесь описание изображения

введите здесь описание изображения

Примечание . Я тестировал только на том же домене. Возможно, нам потребуется добавить заголовок Access-Control-Expose-Headers на сервер для междоменного доступа.

person Pradeep Singh    schedule 17.11.2019

Заголовки ответа в случае корса остаются скрытыми. Вам нужно добавить заголовки ответа, чтобы направить Angular для отображения заголовков в javascript.

// From server response headers :
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, 
Content-Type, Accept, Authorization, X-Custom-header");
header("Access-Control-Expose-Headers: X-Custom-header");
header("X-Custom-header: $some data");

var data = res.headers.get('X-Custom-header');

Источник: https://github.com/angular/angular/issues/5237.

person kuabhina1702    schedule 13.07.2017

По умолчанию пользовательские заголовки MDN не отображаются. Администратор сервера должен раскрыть их, используя «Access-Control-Expose-Headers» так же, как они работают с «access-control-allow-origin».

См. эту ссылку MDN для подтверждения [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers]

person cnngraphics    schedule 22.05.2018