Angular 2 HTTP 响应拦截器

2024-03-11

在 Angular 1 中,全局处理 HTTP 响应状态是通过$httpProvider:

angular.module('app', [])
    .service('httpResponseInterceptor', ['$q', function ($q) {
        this.response = function (response) {
            if (response.status === 418) {
                // do some stuff here
            }
            return response || $q.when(response);
        };
        this.responseError = function (response) {
            if (response.status === 418) {
                // do some stuff here
            }
            return $q.reject(response);
        };
    }])
    .config(['$httpProvider', function ($httpProvider) {
        // do routing, etc.

        $httpProvider.interceptors.push('httpResponseInterceptor');
    }]);


在 Angular 2 中,它完成了扩展Http像这样的东西:

import { Injectable } from '@angular/core';
import {
    Http,
    Response,
    Request,
    RequestOptions,
    RequestOptionsArgs,
    XHRBackend
} from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';

@Injectable()
export class HttpInterceptor extends Http {

  constructor(xhrBackend: XHRBackend, requestOptions: RequestOptions) {
    super(xhrBackend, requestOptions);
  }

  private catchErrors() {
    return (response: Response) => {
      if (response.status === 418) {
            // do some stuff here
      }
      return Observable.throw(response);
    };
  }

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    return super.request(url, options)
          .catch(this.catchErrors());
  }
}

...并将其包含在app.module.ts:

providers: [
    { provide: Http, useClass: HttpInterceptor }
]

See 这个 stackoverflow 答案 https://stackoverflow.com/q/34934009/1298685 and 这个要点 https://gist.github.com/mrgoos/45ab013c2c044691b82d250a7df71e4c以供参考。


但是,我在上面的 Angular 2 代码中收到此错误:

无法实例化循环依赖! Http:在 NgModule AppModule 中


这个配置对我有用;我正在使用 Angular 2 v2.4.1:

应用程序模块.ts

{
    provide: Http,
    useFactory: (backend: XHRBackend, options: RequestOptions) => {
        return new HttpInterceptor(backend, options);
    },
    deps: [XHRBackend, RequestOptions]
}

HttpInterceptor.ts

import { Injectable } from '@angular/core';
import {
    Http,
    ConnectionBackend,
    RequestOptions,
    RequestOptionsArgs,
    Request,
    Response,
    Headers
} from '@angular/http';

import { Observable } from 'rxjs/Rx';

@Injectable()
export class HttpInterceptor extends Http {
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
        super(backend, defaultOptions);
    }

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
        return this.intercept(super.request(url, options));
    }

   ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 HTTP 响应拦截器 的相关文章

随机推荐

  • 救援_来自NoMethodError

    解决这个问题时遇到问题 试图做一个 rescue from NoMethodError with gt try some options 但它不起作用 编辑 为了测试我正在做一个简单的重定向 def try some options red
  • php 会话随机丢失,无法理解为什么

    我付钱给一个程序员制作一个购物篮脚本来与 Spreadshirt API 一起使用 一切都运转良好 只是篮子不断地变空 我认为会话在某个时刻丢失了 因此脚本创建了另一个会话BasketId 我试图找出发生这种情况是否有特定原因 但没有成功
  • 如何在notepad++中使用正则表达式修剪xml标签中的空格?

    我正在尝试修剪一个空间XML标签 这是我所拥有的示例
  • 移动网络性能:将数据从网络服务器传输到移动电话的最有效的数据类型是什么?

    Q 在 Web 服务器 其他 和手机 即 ios android 其他 之间传输数据时 哪种数据类型最有效 最快 JSON XML HTML Q 应该使用什么样的服务器端技术 php mysql Q 应该使用什么样的API 安息吗 RPC
  • 调用 around 方面时出现 AOP 异常

    我正在尝试在所有服务方法上运行一个方面 但这对于具有原始返回类型的方法似乎失败 我收到此错误 org springframework aop AopIn VocationException Null return value from su
  • 为什么 IE10 不显示嵌套的 CSS3 3D 转换元素?

    我在这里有点迷失 我目前正在测试 Windows 8 Release Preview 附带的 IE10 10 0 9200 16384 我遇到了非常困难的时间 困扰我的事情之一是 IE 似乎无法正确处理嵌套 3D 变换 请看这个小提琴 ht
  • Sitecore 插入规则以确保最多 (1) 个特定类型的子级

    sitecore 中有没有办法确保某种类型的项目只能有某种类型项目的 1 个子项 我正在阅读规则引擎食谱 但我没有得到太多细节 我工作过的一个网站要求特定项目类型下不能存在超过 6 个子项目 我们考虑过使用插入选项规则 但决定放弃这个想法
  • Spring可以在抽象类中自动装配吗?

    Spring 无法自动装配我的对象 是否可以在抽象类中自动装配对象 假设所有模式都在 application context xml 中提供 问题 基类和扩展类 如果有 Service Component 上应该使用什么注释 Example
  • Azure 存储 403 禁止异常是 32 位问题吗?

    我们花了相当多的时间来定位出现以下异常的原因 The remote server returned an error 403 Forbidden 堆栈跟踪 at Microsoft WindowsAzure Storage Core Exe
  • PC 客户端上的 C# Crystal Report 总是要求登录提示 SQL Server

    创建setup我的程序 程序运行良好 可以增删改查数据库 当我打开报告时 总是出现登录提示的问题 但在数据库字段中为空禁用 在服务器计算机上 报告没有问题 在我建立连接的代码中 像这样 cnn ServerName 179 15 30 74
  • map() get() 混淆

    我刚刚浏览了 jQuery API 我有点困惑map get 方法 我知道我错了但是map 方法看起来很像 each 陈述 除了文档说它返回一个新的 jQuery 对象 我一直在 jsfiddle 上玩这个 试图弄清楚它 但我还不太明白 h
  • 日志文件监视器

    是否可以在另一个应用程序更新文件时打开文本文件并读取内容 这样就不会导致锁定冲突 我需要监视一个应用程序的日志文件 每次发生事件时该日志文件都会由另一个应用程序更新 在尝试读取文件之前 我会检查该文件是否正在使用 但这似乎并不在所有情况下都
  • 在 Qt Creator 中使用 Qt 标准图标

    我想使用 Qt Standard 图标 as here http standards freedesktop org icon naming spec icon naming spec latest html 我发现了很多例子如何以编程方式
  • Thymeleaf 不解释 sec 标签

    我遇到了一个问题 thymleaf 无法识别我的 Spring Boot 项目中的 sec 标签 例如下面的 sec authentication 未被解释 并按浏览器中的 html 中的形式显示 div Roles span span d
  • 从 Elasticsearch 文档中删除字段

    我需要删除索引到 Elasticsearch 的所有文档中的一个字段 我该怎么做 backtrack 所说的是 true 但是在 Elasticsearch 中有一种非常方便的方法可以做到这一点 Elasticsearch 会抽象出删除的内
  • SQLite .NET,ExecuteScalarAsync,如何知道何时没有结果?

    SQL 语句正在检索行的 ID 但可能不存在这样的行 当我在 GUI 工具中执行特定 SQL 语句时 它返回 0 行在 0 毫秒内返回 但是 当我执行相同的 SQL 语句时ExecuteScalarAsync
  • Spark Scala UDP 在侦听端口上接收

    中提到的例子http spark apache org docs latest streaming programming guide html http spark apache org docs latest streaming pro
  • curl 重新使用 https 连接会话

    我已经使用 openssl 构建了curl 并且能够执行https 连接 现在 每次当curl建立TLS连接时 它都会再次握手 我需要利用客户端与服务器的先前连接会话ID 并在下一个请求中使用它 我已经尝试过以下选项 但每次尝试仍然会进行新
  • 当您有列名的字符向量时,如何不使用 select() dplyr 选择列?

    我正在尝试使用 dplyr 取消选择数据集中的列 但自昨晚以来我无法实现这一目标 我很清楚解决方法 但我正在严格尝试通过 dplyr 找到答案 library dplyr df lt tibble x c 1 2 3 4 y c a b c
  • Angular 2 HTTP 响应拦截器

    在 Angular 1 中 全局处理 HTTP 响应状态是通过 httpProvider angular module app service httpResponseInterceptor q function q this respon