Angular6笔记之封装http的示例代码


Posted in Javascript onJuly 27, 2018

最近抽空学习了一下Angular6,之前主要使用的是vue,所以免不了的也想对Angular6提供的工具进行一些封装,今天主要就跟大家讲一下这个http模块。

之前使用的ajax库是axios,可以设置baseurl,公共头部;集中捕捉错误等,由于Angular6的依赖注入机制,是不能通过直接修改http模块暴露的变量来封装的,但是通过官方文档我们知道可以通过拦截器(HttpInterceptor) 来实现这一功能。 拦截器可以拦截请求,也可以拦截响应,那么通过 拦截请求 就可以实现 设置baseurl,公共头部;而通过 拦截响应 就可以实现 集中捕获错误 。废话不多说,上代码吧。

第一步:准备工作,导入 HttpClientModule

在app.module.ts中导入 HttpClientModule,然后在imports数组中将 HttpClientModule 加入到 BrowserModule 之后,具体代码为:

import { HttpClientModule } from '@angular/common/http';

@NgModule({
 imports: [
  BrowserModule,
  // import HttpClientModule after BrowserModule.
  HttpClientModule,
 ],
 declarations: [
  AppComponent,
 ],
 bootstrap: [ AppComponent ]
})

第二步:新建有关拦截器的文件

在app文件夹下新建http-interceptors文件夹,在其内新建base-interceptor.ts,index.ts两个文件。其中,base-interceptor.ts是用于设置拦截器的注入器文件,index.ts则为扩展拦截器的提供商。

### base-interceptor.ts

import { Injectable } from '@angular/core';
import {
 HttpEvent, HttpInterceptor, HttpHandler, HttpRequest,
 HttpErrorResponse
} from '@angular/common/http';
import { throwError } from 'rxjs'
import { catchError, retry } from 'rxjs/operators';

/*设置请求的基地址,方便替换*/
const baseurl = 'http://localhost:8360';

@Injectable()
export class BaseInterceptor implements HttpInterceptor {

 constructor() {}

 intercept(req, next: HttpHandler) {

  let newReq = req.clone({
   url: req.hadBaseurl ? `${req.url}` : `${baseurl}${req.url}`,
  });
  /*此处设置额外的头部,token常用于登陆令牌*/
  if(!req.cancelToken) {
  /*token数据来源自己设置,我常用localStorage存取相关数据*/
   newReq.headers =
   newReq.headers.set('token', 'my-new-auth-token')
  }

  // send cloned request with header to the next handler.
  return next.handle(newReq)
   .pipe(
    /*失败时重试2次,可自由设置*/
    retry(2),
    /*捕获响应错误,可根据需要自行改写,我偷懒了,直接用的官方的*/
    catchError(this.handleError)
   )
 }
 
 private handleError(error: HttpErrorResponse) {
  if (error.error instanceof ErrorEvent) {
   // A client-side or network error occurred. Handle it accordingly.
   console.error('An error occurred:', error.error.message);
  } else {
   // The backend returned an unsuccessful response code.
   // The response body may contain clues as to what went wrong,
   console.error(
    `Backend returned code ${error.status}, ` +
    `body was: ${error.error}`);
  }
  // return an observable with a user-facing error message
  return throwError(
   'Something bad happened; please try again later.');
 };
}
### index.ts

import { HTTP_INTERCEPTORS } from '@angular/common/http';

import { BaseInterceptor } from './base-interceptor';

/** Http interceptor providers in outside-in order */
export const httpInterceptorProviders = [
 { provide: HTTP_INTERCEPTORS, useClass: BaseInterceptor, multi: true },

];

/*
Copyright 2017-2018 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license
*/

通过克隆修改 req 对象即可拦截请求,而操作 **next.handle(newReq)**的结果即可拦截响应。如果需要修改,可直接扩展 base-interceptor.ts 或 参考 base-interceptor.ts 文件新建其他文件,然后在 index.ts 中正确引入该拦截器,并将其添加到 httpInterceptorProviders 数组中即可。

第三步:注册提供商

在app.module.ts中加入以下代码:

import { httpInterceptorProviders } from './http-interceptors/index'

@NgModule({
 declarations: [
  AppComponent
 ],
 imports: [
  BrowserModule,
  HttpClientModule
 ],
 providers: [
  httpInterceptorProviders
 ],
 bootstrap: [AppComponent]
})

至此,Angular6的http模块封装已经基本完成,如果有需要可以自行扩展,可参考第二步。如果看完以后不明白或者我有写的不对的地方,欢迎大家进行评论。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
JS获取文件大小方法小结
Dec 08 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
详解JavaScript中的事件流和事件处理程序
May 20 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
Dec 02 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
Node.js中DNS模块学习总结
Feb 28 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 Javascript
node.js中事件触发器events的使用方法实例分析
Nov 23 Javascript
JS开发前端团队展示控制器来为成员引流
Aug 14 Javascript
Vue 中axios配置实例详解
Jul 27 #Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 #Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 #Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 #Javascript
JavaScript事件对象event用法分析
Jul 27 #Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 #Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 #Javascript
You might like
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
php的sso单点登录实现方法
2015/01/08 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
web前端开发也需要日志
2010/12/09 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
性能服装:HYLETE
2018/08/14 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
成绩单公证书
2014/04/10 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
小学家长学校培训材料
2014/08/24 职场文书
2014年会计工作总结
2014/11/27 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
常用的Python代码调试工具总结
2021/06/23 Python
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android