【问题标题】:angularjs $httpProvider interceptor documentationangularjs $httpProvider 拦截器文档
【发布时间】:2014-11-28 02:25:36
【问题描述】:

我是 Angular(和编程)的新手,这是一个看似简单的问题,但我无法弄清楚。

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

我想了解更多关于拦截器的事情所以我查看了官方文档,但是我找不到任何与拦截器相关的东西,只有一个方法(useApplyAsync([value]);)和一个属性(默认值)在$httpProvider (docs)。

我从其他教程中知道拦截器是一个常规的服务工厂并且我知道如何使用它,但我的问题是:由于语法是$httpProvider.interceptors.push('interceptorName'),那么我希望我会在其中找到一个名为“interceptors”的属性$httpProvider,但事实上我做不到。我想念什么让这种混乱吗?还是我的概念从根本上完全错误?

【问题讨论】:

  • 这是一本关于拦截器的好书:Interceptors in AngularJS and Useful Examples
  • 我之前已经阅读过这篇文章,但它没有回答我的问题,请仔细阅读我的问题,我的问题似乎是一个普遍的误解,而不是与拦截器相关的具体问题,谢谢。跨度>
  • 我不想回答 - 这是一条评论。
  • 我不认为这是一个评论,这是一个问题,问题是:为什么我在 $httpProvider 文档中找不到拦截器属性?
  • 我不是在质疑你的问题是一个问题,我是在评论我评论过,而不是回答。我发表评论的唯一原因是我愿意提供帮助,但我对这个话题没有足够的信心,但我记得这篇文章对我理解拦截器有很大帮助。我还对这个问题投了赞成票,因为我觉得它很有趣,而且我喜欢努力了解事物的运作方式,并收藏了它,以便我可以看到进展。

标签: javascript angularjs http interceptor angular-services


【解决方案1】:

拦截器位于documentation here

这是一个如何编写的示例。

.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 script from which the docs are generated 中包含以下代码:

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

众所周知,文档通常不完整、不准确和/或令人困惑。直到最近,当我找不到或无法理解某些东西时,我一直认为我是问题所在,但我发现这通常是因为文档很糟糕。然而,我们都应该庆幸我们有如此出色的工具可供使用,并请记住,文档可能很差,因为时间必须集中在编写工具而不是工具的手册上。

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

【讨论】:

  • 感谢您的回答,它清除了一点但仍然无法解决我的问题:如果语法是 $httpProvider.interceptors.push(...),为什么没有一个名为的属性$httpProvider 文档中的拦截器?
  • 我更新的答案对您来说有意义吗?文档通常难以理解且不完整。这很不幸,但很典型。
  • 感谢您更新答案,现在看起来很完美,因为它解释清楚并为我提供了文档的一般图片。任何像我这样的初学者在阅读您的答案后都会减少沮丧和对编码更有信心
  • 我在 Angular 文档中找到了这个,不得不与你分享。看看这个函数返回什么。 “反序列化的东西。” docs.angularjs.org/api/ng/function/angular.fromJson
  • 什么?因为我的第一语言不是英语,所以我可能会误解你的意思。我想你的意思是有时文档很烂,因为“thingy”是一个有趣的术语,不应该放在官方文档中。对吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多