如何拦截$资源请求

时间:2014-06-06 13:00:22

标签: angularjs

是否有办法拦截$ resource调用中的请求?

我想为其添加一个OAUTHv2标头,而不是为每个资源模型指定它。

目前我只能拦截响应,如文档中所述:

  

...

     

interceptor - {Object =} - 拦截器对象有两个可选项   方法 - 响应和响应错误。响应和responseError都有   使用http响应对象调用拦截器。见$ http   拦截器。

我知道你可以在$ http上推送全局拦截器,但我不想在API调用之外的任何请求中包含我的Bearer令牌(安全性......)

任何正在做OAUTHv2的人都必须遇到这个问题。可惜在Angular.JS中没有标准的方法......

2 个答案:

答案 0 :(得分:4)

虽然,这并不明显,但有一种方法可以拦截$资源请求。

以下是一个例子:

<!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> 

工作原理:

  1. $ resource合并操作定义,请求参数和数据以构建$ http请求的配置参数。
  2. 传递给$ http请求的配置参数被视为类似于对象的承诺,因此它可能包含初始化配置的函数。
  3. 动作然后功能可以按照自己的意愿转换请求。
  4. 该演示可在transform-request.html

    找到

    Elsewhere我已经展示过用于取消$资源请求的类似方法。

    另请参阅:Intercept angularjs resource request

答案 1 :(得分:-1)

您可以使用$http拦截器

您可以在$resource方法

的选项中传递它们

关于此的文章:http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/