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 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
jquery showModelDialog的使用方法示例详解
Nov 19 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
浅析Bootstrap表格的使用
Jun 23 Javascript
漂亮实用的页面loading(加载)封装代码
Feb 03 Javascript
深入理解基于vue-cli的vuex配置
Jul 24 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
Dec 29 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与php MySQL 之间的关系
2009/07/17 PHP
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python3实现磁盘空间监控
2018/06/21 Python
python中reader的next用法
2018/07/24 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
购买一个高级域名:BuyDomains
2018/03/11 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
五年级音乐教学反思
2014/02/06 职场文书
安全生产专项整治方案
2014/05/06 职场文书
预备党员公开承诺书
2014/05/28 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
财务人员岗位职责
2015/02/03 职场文书
2015年机关党委工作总结
2015/05/23 职场文书