Как перехватить запросы $resource

Будет ли способ перехватить запросы в вызове $resource?

Я хочу добавить к нему заголовок OAUTHv2 вместо указания этого для каждой модели ресурсов.

В настоящее время я могу только перехватить ответ, как указано в документах:

...

перехватчик - {Object =} - Объект перехватчика имеет два необязательных методы - ответ и responseError. Как ответ, так и responseError перехватчики вызываются с объектом ответа HTTP. См. $Http перехватчики.

Я знаю, что вы можете нажать глобальный перехватчик на $http, но я не хочу включать токен Bearer в любой запрос за пределами вызовов API (безопасность...)

Любой, кто делает OAUTHv2, должен столкнуться с этой проблемой. Жаль, что нет стандартного способа в Angular.JS...

Ответ 1

Хотя, это не очевидно, есть способ перехватить запрос $resource.

Вот пример:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Intercept resource request</title>
  <style type="text/css">.ng-cloak { display: none; }</style>
  <script src="angular.js"></script>
  <script src="angular-resource.js"></script>
  <script>
    angular.module("app", ["ngResource"]).
      factory(
        "services",
        ["$resource", function ($resource)
        {
          return $resource(
            "http://md5.jsontest.com/",
            {},
            {
              MD5: 
              {
                method: "GET",
                params: { text: null },
                then: function(resolve)
                {
                  this.params.text = "***" + this.params.text + "***";
                  this.then = null;
                  resolve(this);
                }
              }
            });
        }]).
      controller(
        "Test",
        ["services", function (services)
        {
          this.value = "Sample text";

          this.call = function()
          {
            this.result = services.MD5({ text: this.value });
          }
        }]);
  </script>
</head>
<body ng-app="app" ng-controller="Test as test">
  <label>Text: <input type="text" ng-model="test.value" /></label>
  <input type="button" value="call" ng-click="test.call()"/>
  <div ng-bind="test.result.md5"></div>
</body>
</html> 

Как это работает:

  • $resource объединяет определение действия, запрашивает параметры и данные для создания параметра конфигурации для запроса $http.
  • Параметр конфигурации, переданный в запрос $http, рассматривается как объект, похожий на обещание, поэтому он может содержать функцию для инициализации конфигурации.
  • Действие, то функция может преобразовать запрос по своему усмотрению.

Демо можно найти на transform-request.html

В другом месте Я уже показал аналогичный подход, используемый для отмены запроса $resource.

Смотрите также: Запросить запрос ресурсов angularjs