Angular6封装http请求的步骤详解


Posted in Javascript onAugust 13, 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]
})

第四步,提取baseurl

为了方便后台修改baseurl,我们可以将baseurl提取为全局变量,在index.html中进行设置,

# index.html 增加
<script>
 window.baseurl = "http://localhost:8360"
</script>
# base-interceptor.ts 修改
const baseurl = window.baseurl;

这样一来,如果后台要修改的话,只需修改index.html中的变量即可,无需再次编译。还有,像这些后期可能更改的变量,建议是直接放在index.html中,因为缓存的原因,如果放在js文件中再引入的话,文件并不能及时更新或是每次都需要更改文件名,会导致不必要的麻烦。

至此,Angular6的http模块封装已经基本完成,如果有需要可以自行扩展,可参考第二步。

ps:下面看下vue与angular的区别

1.vue仅仅是mvvm中的view层,只是一个如jquery般的工具库,而不是框架,而angular而是mvvm框架。

2.vue的双向邦定是基于ES5 中的 getter/setter来实现的,而angular而是由自己实现一套模版编译规则,需要进行所谓的“脏”检查,vue则不需要。因此,vue在性能上更高效,但是代价是对于ie9以下的浏览器无法支持。

3.vue需要提供一个el对象进行实例化,后续的所有作用范围也是在el对象之下,而angular而是整个html页面。一个页面,可以有多个vue实例,而angular好像不是这么玩的。

4.vue真的很容易上手,学习成本相对低,不过可以参考的资料不是很丰富,官方文档比较简单,缺少全面的使用案例。高级的用法,需要自己去研究源码,至少目前是这样。

总结

以上所述是小编给大家介绍的Angular6封装http请求的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
Vuejs 单文件组件实例详解
Feb 09 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
JavaScript实现H5接金币功能(实例代码)
Feb 22 Javascript
解决angularjs中同步执行http请求的方法
Aug 13 #Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 #Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 #Javascript
angularjs $http调用接口的方式详解
Aug 13 #Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 #Javascript
vue实现文件上传功能
Aug 13 #Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
Aug 13 #Javascript
You might like
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
js切换光标示例代码
2013/10/10 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
Python中return语句用法实例分析
2015/08/04 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
python绘制直线的方法
2018/06/30 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
python调用私有属性的方法总结
2020/07/24 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
分家协议书
2014/04/21 职场文书
委托证明模板
2014/09/16 职场文书
小数乘法教学反思
2016/02/22 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server