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 相关文章推荐
Add a Table to a Word Document
Jun 15 Javascript
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
Js控制滑轮左右滑动实例
Feb 13 Javascript
移除AngularJS下URL中的#字符的方法
Jun 19 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
jQuery监听浏览器窗口大小的变化实例
Feb 07 Javascript
微信小程序 基础知识css样式media标签
Feb 15 Javascript
Javascript封装id、class与元素选择器方法示例
Mar 13 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 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-fpm启动参数及配置详解
2013/11/04 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
Python写的英文字符大小写转换代码示例
2015/03/06 Python
python实现自动更换ip的方法
2015/05/05 Python
Python基于select实现的socket服务器
2016/04/13 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
电气工程和自动化自荐信范文
2013/12/25 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
人事专员工作职责
2014/02/22 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
走近毛泽东观后感
2015/06/04 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
使用pytorch实现线性回归
2021/04/11 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技