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 相关文章推荐
JQuery 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
innerText 使用示例
Jan 23 Javascript
js实现滑动触屏事件监听的方法
May 05 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
javascript实现下拉提示选择框
Dec 29 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
Promise.all中对于reject的处理方法
Aug 01 Javascript
jQuery 查找元素操作实例小结
Oct 02 jQuery
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 jQuery
解决qrcode.js生成二维码时必须定义一个空div的问题
Jul 09 Javascript
关于vue属性使用和不使用冒号的区别说明
Oct 22 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下打开URL地址的几种方法小结
2010/05/16 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
json数据的列循环示例
2013/09/06 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
javascript常用方法汇总
2014/12/02 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
一个SQL面试题
2014/08/21 面试题
工程专业求职自荐书范文
2014/02/18 职场文书
德语专业求职信
2014/03/12 职场文书
地球一小时宣传标语
2014/06/24 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
React如何创建组件
2021/06/27 Javascript
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电