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 focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
利用window.name实现windowStorage代码分享
Jan 02 Javascript
详解JavaScript中void语句的使用
Jun 04 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
Jul 27 Javascript
jQuery 获取多选框的值及多选框中文的函数
May 16 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
详解关于webpack多入口热加载很慢的原因
Apr 24 Javascript
前端插件之Bootstrap Dual Listbox使用教程
Jul 23 Javascript
js实现转动骰子模型
Oct 24 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
初级的用php写的采集程序
2007/03/16 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
php生成shtml类用法实例
2014/12/09 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
vue如何截取字符串
2019/05/06 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python使用列表的最佳方案
2020/08/12 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
运动员口号
2014/06/09 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
《雷雨》教学反思
2016/02/20 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js