问题标签 [angular-http-interceptors]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
angularjs - 在 Jasmine 测试中模拟 AngularJS $httpBackend 并使用装饰器时出现“$httpBackend.when 不是函数”错误
我正在使用 Angular 服务 $httpBackend 的装饰器来更改所有 http 调用的 url:
在一些 Jasmine 测试中,我需要模拟 $httpBackend 服务:
现在我在执行这些测试时收到错误“$httpBackend.when 不是函数”。
知道如何解决这个问题吗?我更喜欢没有在我的应用程序配置中测试特定代码的解决方案。
angularjs - 如何在角度 HTTP 拦截器中获取绝对 URL?
在我们的应用程序中,对于每个请求,前端都会对 url + 数据进行哈希处理并将它们发送到服务器。然后服务器验证查询参数以及数据没有被篡改。但是,在httpinterceptor中,我只能查看config.url和config.params。没有办法获得绝对网址,所以我不能直接对它进行哈希处理。我该怎么做呢?我尝试了一些类似的东西
但是,这不起作用,因为我似乎无法以这种方式访问参数。另外,如何确定参数与请求 URL 的顺序相同?显然,如果它甚至有 1 个字符不同,散列就不会是正确的。
angularjs - 角度请求忙拦截器
更新
我想我自己解决了。检查我在下面作为解决方案发布的拦截器。
原来的
我想知道是否可以编写一个 http 拦截器,让调用者知道请求是如何进行的。
现在,当我想调用我的后端时,我将一个 $http 调用包装在一个包装器中,该包装器设置我传递给它的对象的属性:
在这种情况下,我调用login(authArgs, $scope.loginCtrl)
了我的登录页面控制器。然后我在我的登录模板中使用loginCtrl.busy
, loginCtrl.result
& 。loginCtrl.error
我非常希望我对后端的每次调用都设置这些属性并使它们可用于发起请求的视图。
使用这样的包装函数可以完成工作,但我想知道是否可以使用拦截器来完成?在我看来,这将提供一个更清晰的请求流,不需要我将所有后端调用显式包装在我的服务中。
现在我阅读了 httpInterceptors,似乎找不到让它们在用户提供的对象上设置属性的方法。我发现关闭的东西是这篇文章,它有一个示例(时间戳标记(请求和响应拦截器)),它们在拦截器阶段request
和response
拦截器阶段向配置对象添加属性。它们没有显示如何访问配置对象中的responseError
阶段或在调用者控制器中。
任何帮助将不胜感激 :)
angularjs - Twitter 在使用 AngularJS 访问 GET 状态/user_timeline 时返回错误
我正在尝试使用 Angularjs 访问 Twitter GET statuses/user_timeline。我已经随身携带了不记名令牌。我正在尝试使用 Angularjs 进行仅应用程序身份验证。
错误代码 选项https://api.twitter.com/1.1/statuses/user_timeline.json(匿名函数)@ angular.js:10722sendReq @ angular.js:10515serverRequest @ angular.js:10222processQueue @ angular.js:14745(anonymous函数) @ angular.js:14761Scope.$eval @ angular.js:15989Scope.$digest @ angular.js:15800Scope.$apply @ angular.js:16097bootstrapApply @ angular.js:1660invoke @ angular.js:4478doBootstrap @ angular. js:1658bootstrap @ angular.js:1678angularInit @ angular.js:1572(匿名函数) @ angular.js:28899trigger @ angular.js:3024eventHandler @ angular.js:3298 (index):1 XMLHttpRequest 无法加载https://api .twitter.com/1.1/statuses/user_timeline.json。预检响应具有无效的 HTTP 状态代码 400
下面是我写的代码。
在我的主应用程序中
在控制器中
我无法从 Twitter 检索数据。请帮忙。我还为 Chrome 添加了 CORS 插件,但仍然没有帮助。我尝试过使用 Xampp 和 nodejs 但没有效果。
angularjs - Angular - 限制 HTTP 拦截器重试
我编写了一个拦截器,当响应错误时,如果本地存储中存在状态代码和访问令牌,则重试 HTTP 请求。
我写这篇文章主要是为了应对来自我们正在使用的 API 的神秘失败的响应(我无法控制),因为在某些情况下重试就足够了。有时 API 端点会无缘无故地失败,所以我想,由于我无法控制 API 的维护,我只能重试发送 HTTP 请求。
但是,在 API 中确实存在错误的情况下,这会导致拦截器无限重试。
我想要实现的是限制此拦截器的重试次数。我试过在里面放一个计数器,但似乎计数器没有继续下一个拦截器调用。
我一直在寻找可以解决这种情况但无济于事的东西。有没有办法限制拦截器响应错误重试?
angularjs - AngularJS:将数据从控制器传递到应用程序配置
我对 Angular 很陌生。我在我的 Angular 应用程序中使用令牌身份验证。我使用 HTTP 拦截器来检查我的后端何时返回 401,然后使用刷新令牌进行登录:
现在,refresh_token 来自我的登录控制器(它从 api 后端提取它)。所以控制器必须以某种方式将它传递给拦截器。问题是拦截器位于配置块中,因此没有服务、值等 - 只有提供者。但是提供者不能注入到控制器中。那么有没有办法将数据从控制器传递到app.config?如果没有,是否有解决方法?注入器可以在 app.config 以外的任何地方吗?
angularjs - $http(config) 中的绝对或相对 URL;
我正在编写一个有角度的拦截器,我对配置对象特别是 URL 属性有疑问,因为在文档中说有“正在请求的资源的绝对或相对 URL”,但实际上某些方法给出了相对路由另一个是绝对的,那么如何对所有方法做一个相对的路线?
配置对象文档https://docs.angularjs.org/api/ng/service/ $http#usage
angularjs - 拦截器和 ng-bind
我正在学习拦截器。我在控制台上“打印”结果,但我想在屏幕上显示它们,如 {{}} 或使用 ng-bind。我试过了,但我做不到。
任何人都可以帮助我吗?
谢谢!
javascript - Angularjs 1.4 拦截器不工作
首先让我说我是角度的菜鸟,所以我怀疑基于我缺乏理解的一个非常愚蠢的错误。
我正在尝试创建一个拦截器来处理请求和响应错误。
如果我在文件顶部放置一个警报,它就会被调用,所以它正在加载文件。但是没有其他警报,包括文件底部和调用配置之前的警报。responseError 和 requestError 永远不会被调用...
我已经尝试将其简化到重现问题的最低限度,我尝试了几个不同的示例来说明如何实现它,以防我使用过时的代码,我尝试注释掉控制器中的错误子句以防它吞下例外.....我大部分时间都在用谷歌搜索试图让它工作,我很难过。
非常感谢任何帮助,尤其是对深入了解正在发生的事情的帮助
----为后人解答相关信息----
基于 sbedulins 和 Angad 答案的组合,我能够让它工作。
首先,一旦我得到它的工作,它可以在responeError和RequestError周围使用和不使用单引号......
dependency1 和 2 是未定义的,并且来自我在 SO 上得到的简化示例中的剪切和粘贴错误。所以我删除了它们。
然后我用 angular.module('defaultApp') 替换了模块,所以模块是示例中的占位符,而不是某种方便的全局存储它......你需要明确定义你的模块,(或变量模块)(是的,我真的是角度的新手)
因此,一旦将所有这些更改应用于 sbedulins 示例,我就在这里为这两种方法获得了工作代码,因为 postetity 这里是我的应用程序中的实际工作代码
或者
非常感谢您的所有帮助,我在示例中学到了有关角度速记的重要知识。sbedulin 得到了答案,即使我需要评论的帮助才能得到他/她的答案
angularjs - 在刷新身份验证令牌时处理多个未经授权的请求
使用 JWT 进行 API 身份验证的 Angular 应用程序会在 API 调用返回时启动登录对话框401 "Unauthorized"
,让用户输入他的凭据并获取新的有效 JWT。然后应用程序重试失败的未经授权的请求并保持流程。
此处列出的代码基于Chris Clarke的此解决方案。
问题是当有多个请求使用过期令牌时。第一个返回应该触发登录对话框并获取新令牌。但是如何让其他待处理的请求等到新令牌可用?可以设置一个标志来告诉所有随后的传入响应正在请求一个新令牌。可以返回一个承诺,并且所有配置对象都可以存储在服务的数组中。当新令牌可用时,可以重试所有等待的请求。但是在新令牌可用后返回的未经授权的请求会发生什么?他们将触发一个新的登录对话框。
一些注意事项:
这个答案给出了一个相关问题的解决方案,但由于这里涉及到一个新的登录,我看不出如何使解决方案适应这种情况。
这不是自动更新令牌的选项。令牌将有 8 小时有效期(一个工作会话),并且必须重新登录。
- 在配置对象中注入服务(
cslAuth
和此处)是否安全?$http
我的代码正在运行,但我已经读过它们目前还不能完全准备好。