AngularJS $httpProvider 拦截器文档

16

我刚接触 Angular(和编程),这是一个看似简单但我却无法解决的问题。

一些教程建议使用 $httpProvider.interceptors.push('interceptorName') 来操作 http 请求和响应。

我想更多地了解拦截器,所以我查看官方文档,但我找不到与拦截器相关的任何内容,在 $httpProvider 中只有一个方法(useApplyAsync([value]);)和一个属性(defaults)(docs)。

我从其他教程中知道拦截器是常规服务工厂,我也知道如何使用它,但我的问题是:由于语法是 $httpProvider.interceptors.push('interceptorName'),因此我希望能在 $httpProvider 中找到一个名为“拦截器”的属性,但实际上我找不到。是我忽略了某些东西吗?还是从一开始我的概念就完全错误了?


这是一篇关于拦截器的好文章:AngularJS中的拦截器和有用示例 - alecxe
我之前已经阅读了这篇文章,但它并没有回答我的问题,请仔细阅读我的问题,我的问题似乎是一个普遍的误解,而不是与拦截器相关的具体问题,谢谢。 - webberpuma
我并不是在尝试回答 - 这只是一条评论。 - alecxe
我认为这不是一条注释,而是一个问题。问题是:为什么在$httpProvider文档中找不到拦截器属性? - webberpuma
1
我并不质疑你的问题是否是一个问题,我只是在评论而非回答。我留下评论的唯一原因是我愿意帮忙,但对于这个主题我不够自信,但我记得这篇文章帮助了我很多,让我理解了拦截器。我还点赞了这个问题,因为我觉得它很有趣,我喜欢努力去理解事物的态度,并将其收藏以便查看进展。 - alecxe
抱歉误解了你的评论,让我们看看进展吧 :) - webberpuma
1个回答

27

拦截器在这里的文档中。

下面是编写拦截器的示例。

.config([
  '$httpProvider',
  function($httpProvider) {

    var interceptor = [
      '$q',
      '$rootScope',
      'userSession',
      function($q, $rootScope, userSession) {

        var service = {

          // run this function before making requests
          'request': function(config) {

            if (config.method === 'GET' || userSession.isAuth()) {
              // the request looks good, so return the config
              return config;
            }

            // bad request, so reject
            return $q.reject(config);

          }

        };

        return service;

      }
    ];

    $httpProvider.interceptors.push(interceptor);

  }
])

关于拦截器的内容在$httpProvider文档页面中没有提到的原因是开发人员在$http脚本中未包含以下代码:

/**
   * @ngdoc property
   * @name $httpProvider#interceptors
   * @description
// etc

一般来说,文档往往不完整、不准确或令人困惑。直到最近,我总认为自己无法找到或理解某些东西是因为我自己的问题,但我发现这通常是因为文档太烂了。然而,我们应该感激拥有这样优秀的工具,并牢记可能文档之所以贫瘠是因为精力需要集中在编写工具本身而不是工具的使用手册上。

最可靠的“文档”是源代码本身,尽管它可能不那么友好地阅读!在上面链接的源代码中,你可以看到this.interceptors = []this指的是$httpProvider,因此它正在将属性interceptors分配给值为空数组的$httpProvider。要添加您的拦截器,只需将其push()到该数组即可。


我的更新答案对你来说有意义吗?文档通常很难理解且不完整。这是不幸的,但很典型。 - m59
因为我刚接触angularjs(而且,说实话,我对编程也不是很熟悉),所以如果官方文档没有某些内容,我会感到不舒服,我会想到自己一定还有一些基本的编程概念没掌握。无论如何,非常感谢你的回复,你甚至向我展示了源代码(虽然我看不懂),并告诉我大部分文档都不好,这帮了我很多。 - webberpuma
2
感谢您更新答案,现在它看起来完美了,因为它清晰地解释并为我提供了文档的概述。像我这样的初学者在阅读了您的答案后将会更少受挫,更有信心编码。 - webberpuma
1
我在 Angular 文档中发现了这个,必须和你分享。看看这个函数返回了什么。“反序列化的东西。”https://docs.angularjs.org/api/ng/function/angular.fromJson - m59
1
什么?因为我的母语不是英语,所以我可能会误解你的意思。我猜你的意思是有时候文档很糟糕,因为“thingy”是一个俏皮的词汇,不应该出现在官方文件中。是这样吗? - webberpuma
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接