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日期处理函数
Oct 16 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
javascript函数作用域学习示例(js作用域)
Jan 13 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
Mar 20 Javascript
windows8.1+iis8.5下安装node.js开发环境
Dec 12 Javascript
JS+CSS实现闪烁字体效果代码
Apr 05 Javascript
JavaScript类的写法
Sep 17 Javascript
JavaScript实现经典排序算法之冒泡排序
Dec 28 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
微信小程序动态的加载数据实例代码
Apr 14 Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 Javascript
微信小程序实现人脸识别登陆的示例代码
Apr 02 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
用mysql内存表来代替php session的类
2009/02/01 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
js判断空对象的实例(超简单)
2016/07/26 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
python遍历数组的方法小结
2015/04/30 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
Python贪心算法实例小结
2018/04/22 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
params有什么用
2016/03/01 面试题
如何撰写岗位职责
2014/02/01 职场文书
英语教学随笔感言
2014/02/20 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
python实现简单反弹球游戏
2021/04/12 Python
Python基础教程,Python入门教程(超详细)
2021/06/24 Python
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js