iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用angular的HttpClient搭配rxjs
  • 214
分享到

如何使用angular的HttpClient搭配rxjs

2024-04-02 19:04:59 214人浏览 薄情痞子
摘要

小编给大家分享一下如何使用angular的HttpClient搭配rxjs,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、原H

小编给大家分享一下如何使用angularHttpClient搭配rxjs,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、原Http使用总结

使用方法

1.在根模块或核心模块引入HttpModule

即在AppModule或CoreModule中引入HttpModule:

import { HttpModule } from '@angular/http';
@NgModule({
 import: [ HttpModule ]
 // ...
})
AppModule {}

2.在使用的地方注入Http服务

import { Http } from '@angular/http';
// ...
constructor(
 private http: Http
) {}
nGonInit() {
 this.http.get(`url`).subscribe((res) => {
// 成功回调
 }, (err) => {
// 失败回调
 });
}
// ...

3.使用可选参数

 若想在请求中添加特定的头部或者身体,就需要配置请求的可选参数:

import { Http, Header } from '@angular/http';
// ...
this.http.delete(`url`, {headers: new Header(), body: { } }).subscribe(...);
// ...

缺陷

已知缺陷之一为不支持文件传输,如果想要写一个文件上传的客户端,就只能使用JS原生的XMLHttpRequest对象,然后自己封装上rxjs得到一个较通用的文件上传服务,可以参考 ngx-uploader。

另一个不能算缺陷的缺陷是Http请求得到的响应结果必须手动执行JSON()以得到json格式的结果。

二、改用HttpClient

HttpClient能力在angular 4.3版本开始引入在@angular/common/http中

使用方法

基本使用方法与原Http服务类似,先引入HttpClientModule,然后注入HttpClient服务使用:

import { HttpClientModule } from '@angular/common/http';
// ...
@NgModule({
 import: [ HttpClientModule ]
})
// ...
import { HttpClient } from '@angular/common/http';
// ...
constructor(
 private http: HttpClient
) {}
// ...
this.http.get('url').subscribe((res) => {
 // 成功回调
}, (err) => {
 // 失败回调
});
// ...

添加额外头部等信息的话类似原Http服务,引入相关的变量后填入第二个可选参数即可。

改进与加强

1.支持更多类型的请求,比如更改可选参数的responseType值可改为直接请求text内容
2.不再需要手动调用json()来将结果转为json格式,订阅到的结果已经是body且转为了json(请求text的话直接就是text内容)。
3.支持监听请求进度(可用于文件上传)。
4.添加了拦截器能力,用于预设请求规则和响应预处理。

缺陷

已知的一个小缺陷是,delete请求不能再添加body作为可选参数了,这个略尴尬,难道批量删除也得乖乖把参数拼到url中。。。

三、拦截器

本文暂不讨论文件上传以及请求进度的监听能力,可以查看官网的相关内容,本文主要来讲拦截器的简单使用。

给应用注入拦截器的效果是,所有的HttpClient发起的请求都将执行这个拦截器,类似node中的中间件。且无论是请求之前的预处理还是得到响应后的预处理都能做到。

笔者想到的第一个用处就是不再需要写一个自己的Http服务来代执行angular的Http服务了,以往如果想要给应用的所有请求都添加比如认证功能的请求头的话,比较好的办法就是自己建立一个MyHttp服务来代为调用Http方法,并在请求回调中添加统一的结果处理。

拦截器属于特殊服务,实现了HttpInterceptor类:

import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http';

@Injectable()
export class MyInterceptor implements HttpInterceptor {
 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 return next.handle(req);
 }
}

编辑好拦截器后需要注入到根模块中:

import {NgModule} from '@angular/core';
import {HTTP_INTERCEPTORS} from '@angular/common/http';

@NgModule({
 providers: [{
 provide: HTTP_INTERCEPTORS,
 useClass: MyInterceptor,
 multi: true,
 }],
})
export class AppModule {}

预处理请求

所有工作都在拦截器中的intercept方法中进行,如果要给所有请求加一个认证头部,可以操作其中的req参数,注意req参数为只读的,必须执行其clone方法得到副本来操作,处理完的副本通过next参数发射出去即可:

public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 let authInfo = {token: 'testtoken', admin: 'testadmin'};
 const authReq = req.clone({
  headers: req.headers
  .set('Authorization', authInfo.token || '')
  .set('Admin', authInfo.admin || '')
  .set('Content-Type', 'application/json;charset=UTF-8')
 });
 return next.handle(authReq);
}

这样实际使用请求时可以直接使用HttpClient,所有请求都会实现添加配置好的头部信息。

响应预处理

请求得到结果后,往往需要对结果进行一些判断,比如某些错误是请求本身的错误,这些错误会直接抛出到rxjs的error流中,某些请求本身是成功的,但是是属于一些服务器逻辑给出的错误,这类错误如果不做处理是会被认为是成功的请求而直接next到成功回调的,这会导致最终订阅请求时,错误的回调要做错误处理,成功回调中也存在需要做错误处理,感觉成功还得分为成功地成功和成功地失败,很尴尬:

someReq().subscribe((res) => {
 if (res.state) {
 // 真正成功
 } else {
 // 还是失败
 }
}, (err) => {
 // 失败
});

通过拦截器可以对请求结果进行重新整理,保证成功回调必然成功,失败回调必然失败:

return next.handle(authReq).map((event) => {
 if (event instanceof HttpResponse) {
 switch (event.status) {
  case 200:
  if (event.body['state']) {
  let newEvent = event.clone({body: event.body['data']});
  return newEvent;
  } else {
  throw event.body['msg'];
  }
  case 401:
  this.storage.remove('auth_token');
  this.router.navigate(['/login']);
  default:
  throw `【${event.status}】【${event.statusText}】`;
 }
 }
 return event;
});

响应预处理的一句话总结就是操作intercept方法返回的next.handle(req),使用rxjs的map操作符进行映射。

如何使用angular的HttpClient搭配rxjs

四、搭配rxjs

rxjs是angular严重依赖的一个大坑,初次接触会被其创建和订阅这种使用方式搭配一大堆眼花缭乱的操作符弄得一脸懵逼。

创建-订阅的请求方式

原Http和新的HttpClient两个服务流严重依赖了rxjs,请求的发起返回的是一个Observable对象,其定义好后并不会直接发起请求,真正发起请求是在执行其subscribe方法的时候,此方法接收三个参数,分别是成功回调、失败回调和完成回调。

Promise的套路是请求在定义(调用)的时候就发起了,然后迎来的是一连串的then()和catch()。可以从catch中resolve到then,或者从then中reject到catch。

rxjs的套路则是先创建出一个观察者对象(Observable),可以用许多操作符定义许多规则,比如个人感觉很接近then的map操作符,以及接近catch的catch操作符。可以从map操作符中直接throw到错误回调,或者在catch操作符中捕捉错误并返回新的成功的流。这一切都不会触发这个请求,只有最终subscribe()的时候,才会真正执行整个请求,并在三种回调中体现。

如何使用angular的HttpClient搭配rxjs

以上是“如何使用angular的HttpClient搭配rxjs”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网JavaScript频道!

--结束END--

本文标题: 如何使用angular的HttpClient搭配rxjs

本文链接: https://www.lsjlt.com/news/75678.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用angular的HttpClient搭配rxjs
    小编给大家分享一下如何使用angular的HttpClient搭配rxjs,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、原H...
    99+
    2024-04-02
  • Angular搜索场景中如何使用rxjs的操作符处理
    这篇文章主要为大家展示了“Angular搜索场景中如何使用rxjs的操作符处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular搜索场景中如何使用rx...
    99+
    2024-04-02
  • C#如何使用HttpClient
    这篇文章给大家分享的是有关C#如何使用HttpClient的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。错误使用New HttpClient如下面一段代码,日常开发中经常使用的 call http 方式,每次 n...
    99+
    2023-06-25
  • Angular2使用Angular-CLI如何搭建工程
    这篇文章给大家分享的是有关Angular2使用Angular-CLI如何搭建工程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用iconfonticonfont是阿里巴巴的ic...
    99+
    2024-04-02
  • React中如何使用RxJS优化数据流
    这篇文章主要介绍了React中如何使用RxJS优化数据流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中如何使用RxJS优化数据流文章都会有所收获,下面我们一起来看看吧。一般来说,处理组件中的数据流无...
    99+
    2023-07-05
  • angular如何使用$apply
    这篇文章主要介绍了angular如何使用$apply,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。有的时候在回调里面写了更新scope的里面...
    99+
    2024-04-02
  • 如何使用Angular JS + Express JS入门搭建网站
    这期内容当中小编将会给大家带来有关如何使用Angular JS + Express JS入门搭建网站,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。月份开始,接到了新的任务,跟UI开发有关,用的是Angul...
    99+
    2023-06-17
  • content如何搭配quotes使用
    这篇文章主要讲解了“content如何搭配quotes使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“content如何搭配quotes使用”吧! 在C...
    99+
    2024-04-02
  • ASP.NET Core如何使用HttpClient调用WebService
    本文小编为大家详细介绍“ASP.NET Core如何使用HttpClient调用WebService”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET Core如何使用HttpClient调用WebServi...
    99+
    2023-06-29
  • Java服务RestTemplate与HttpClient如何使用
    这篇“Java服务RestTemplate与HttpClient如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2023-07-02
  • java中如何使用HttpClient调用接口
    目录java使用HttpClient调用接口HttpClient 提供的主要的功能直接言归正传了!!!!上代码java的HttpClient调用远程接口使用方法实例java使用Htt...
    99+
    2022-11-13
    java使用HttpClient HttpClient调用接口 java HttpClient
  • 如何使用angular框架
    这篇文章给大家分享的是有关如何使用angular框架的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。简介关于service worker,网络上已经有了较多的文章。总的来说它依靠缓...
    99+
    2024-04-02
  • angular如何使用monaco-editor
    今天小编给大家分享一下angular如何使用monaco-editor的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
    99+
    2024-04-02
  • angular的HttpClientModule模块如何使用
    这篇文章主要介绍“angular的HttpClientModule模块如何使用”,在日常操作中,相信很多人在angular的HttpClientModule模块如何使用问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • Python和Apache如何搭配使用?
    Python是一种高级编程语言,广泛用于数据分析、机器学习、人工智能等领域。Apache是世界上最流行的Web服务器软件,用于托管网站和Web应用程序。在本文中,我们将讨论如何将Python和Apache搭配使用,以便更好地管理和托管Py...
    99+
    2023-08-08
    apache npm javascript
  • 如何使用Angular+Angular-Ui实现分页
    这篇文章主要介绍如何使用Angular+Angular-Ui实现分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先看效果:采用了Angular-UI中的分页组件,关于Angular...
    99+
    2024-04-02
  • ASP和Linux如何搭配使用?
    ASP和Linux如何搭配使用? 随着互联网的发展,越来越多的网站需要使用ASP来实现动态交互功能,而Linux系统则因其高效、稳定、安全等优势而成为服务器运行的首选操作系统。那么ASP和Linux如何搭配使用呢?本文将为您详细介绍。 一、...
    99+
    2023-10-31
    linux http 对象
  • 如何使用apache的HttpClient进行http通讯
    这篇文章主要讲解了“如何使用apache的HttpClient进行http通讯”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用apache的HttpC...
    99+
    2024-04-02
  • angular的scopel指令如何使用
    这篇文章主要介绍了angular的scopel指令如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇angular的scopel指令如何使用文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • 如何用DevUI搭建自己的Angular组件库
    目录前言创建组件库关键配置修改目录布局调整库构建关键配置开发一个Alert组件组件功能介绍组件结构分解定义输入输出定义布局测试Alert组件开发态引用组件编写单元测试发布组件前言 作...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作