试水新的Angular4 HTTP API
本文来自网易云社区
作者:梁月康
原文:https://netbasal.com/a-taste-from-the-new-angular-http-client-38fcdc6b359b
Angular更新了新的 4.3.0-rc.0 版本。在这个版本里,我们可以发现更新了我们一直期待的新功能 —— 一个革新了的HTTP Client API
HttpClient 是对现存的Angular HTTP API 一次进化,现有的HTTP API存在于一个单独的包中,即@angular/common/http。 这样的结构确保了已有的代码库可以慢慢更新到新的API而不至于出现断崖的更新
安装
首先,我们需要更新包版本到 4.3.0-rc.0 版本。 接下来,我们需要把 HttpClientModule 引入到我们的 AppModule 里
\\http-init.tsimport { HttpClientModule } from '@angular/common/http';@NgModule({ declarations: [
AppComponent
], imports: [
BrowserModule,
HttpClientModule
], bootstrap: [AppComponent]
})
export class AppModule { }
`
现在我们准备好了。让我们来看看三个令人期待的新功能
默认使用JSON
JSON 作为默认的数据格式而不再需要明确地写出来需要解析
我们再也不需要写下如下的代码
http.get(url).map(res => res.json()).subscribe(...)
现在我们只需要写下
http.get(url).subscribe(...)
拦截器(Interceptors)支持
拦截器 允许在 管道语法(pipeline)中注入中间件
\\request-interceptor.tsimport {
HttpRequest,
HttpHandler,
HttpEvent
} from '@angular/common/http';@Injectable()class JWTInterceptor implements HttpInterceptor {
constructor(private userService: UserService) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const JWT = `Bearer ${this.userService.getToken()}`;
req = req.clone({ setHeaders: { Authorization: JWT
}
}); return next.handle(req);
}
}
`
如果我们想要注册一个新的拦截器,我们需要去实现(implements)这个 HttpInterceptor 接口(interface)。这个接口有一个方法我们必须要去实现 —— 即拦截器
这个拦截器方法将会给我们一个请求对象(the Request object)、HTTP处理器(the HTTP handler)并且返回一个HttpEvent 类型的可观察对象(observable)
请求和返回对象需要是不可改变的。因此,我们需要在返回之前提前拷贝一个原始请求
接下来,next.handle(req) 方法将会调用一个带上新请求的底层的XHR然后返回一个返回事件的事件流(stream)
\\interceptor-response.ts@Injectable()class JWTInterceptor implements HttpInterceptor {
constructor(private router: Router) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(req).map((event: HttpEvent<any>) => { if (event instanceof HttpResponse) { // do stuff with response if you want
}
}, (err: any) => { if (err instanceof HttpErrorResponse { if (err.status === 401) { // JWT expired, go to login
}
}
});
}
}
`
拦截器也可以选择通过应用附加的 Rx 操作符来转换响应事件流对象,在next.handle()中返回。
最后我们需要去做的注册该拦截器,使用 HTTP_INTERCEPTORS 注册 multi Provider:
[ { provide: HTTP_INTERCEPTORS, useClass: JWTInterceptor, multi: true } ]
进度事件
进度事件可以既用于请求上传也可以用于返回的下载
\\http-progress.ts
import {
HttpEventType,
HttpClient,
HttpRequest
} from '@angular/common/http';
http.request(new HttpRequest( 'POST',
URL,
body,
{
reportProgress: true
})).subscribe(event => { if (event.type === HttpEventType.DownloadProgress) { // {
// loaded:11, // Number of bytes uploaded or downloaded.
// total :11 // Total number of bytes to upload or download
// }
} if (event.type === HttpEventType.UploadProgress) { // {
// loaded:11, // Number of bytes uploaded or downloaded.
// total :11 // Total number of bytes to upload or download
// }
} if (event.type === HttpEventType.Response) {
console.log(event.body);
}
})
```
如果我们想要获得上传、下载进度的提示信息,我们需要传 { reportProgress: true }给 HttpRequest对象
这里还有两个新的功能我们今天没有提到:
基于内部测试框架的 Post-request verification 和 flush 功能 类型化,同步响应体访问,包括对 JSON body类型的支持。
以上只是对新的HTTP API和它的新功能的概述,完整的代码可以看 angular/packages/common/http
译者注
应该在哪里注册拦截器呢?
\\app.module.ts@NgModule({
imports: [ BrowserModule ],
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: JWTInterceptor, multi: true }
], declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
相关文章:
【推荐】 云计算交互设计师的正确出装姿势
【推荐】 设计狮攻心篇——你的方案为何很难推进
试水新的Angular4 HTTP API的更多相关文章
- 大众点评试水O2O新模式:实体店试穿,扫描二维码付款 现场取货
在餐饮美食行业取得不错的成绩之后,大众点评将触角延伸到了线下的传统商铺,开始涉足线下商品的 O2O 团购.和传统的线上下单,线下消费的 O2O 模式不同.大众点评的 O2O 团购用户,可在店内试穿后通 ...
- phaser2->3:来个打地鼠试水
本文中phaser具体版本 phaser2:2.8.1 phaser3:3.17.0 一.实现效果二.实现细节三.项目总结四.参考文档 一.实现效果 源码地址(phaser2&phaser3) ...
- CSharpGL(49)试水OpenGL软实现
CSharpGL(49)试水OpenGL软实现 CSharpGL迎来了第49篇.本篇内容是用C#编写一个OpenGL的软实现.暂且将其命名为SoftGL. 目前已经实现了由Vertex Shader和 ...
- 微博试水卖车社交电商怎样令4S“颤抖”?
微博对社交电商的探索一直在深入,年初.微博上线了"支付"产品.从而使社交产业链实现了闭环,随后,微博又尝试售卖多种商品,不断扩大移动电商的试水范围,近期微博大规模汽车销售收 ...
- Google 新推出Background sync API
Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- Android 6.0 新功能及主要 API 变更
运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...
- 新浪短链接API接口示例
<?php /** * URL地址长短切换,由sina新浪短链接API生成 * User: chenqt * Date: 2016/8/23 * Time: 18:45 */ class Url ...
- 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API
原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...
随机推荐
- Yii2.0 高级版安装 windows
最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...
- 构建第一个Spring Boot2.0应用之项目创建(一)
1.开发环境 IDE: JAVA环境: Tomcat: 2.使用Idea生成spring boot项目 以下是使用Idea生成基本的spring boot的步骤. (1)创建工程第一步 (2)创建工 ...
- ArcGIS API for Javascript 使用缓冲区结果做query查询出现“esri.config.defaults.io.proxyUrl 尚未进行设置”错误
1.前言 在研究ArcGIS API for JavaScript时会遇到这样的问题,比如我们在做缓冲区分析时,用分析的范围作为空间查询query的参数,在执行结果中总是会看到“esri.config ...
- A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)
注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...
- cms系统-帖子页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 解决MVC运行controller的时候只有有参构造函数但是程序一定要走无参构造函数的方法
方法如下 https://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be
- POJ 3469 Dual Core CPU(最小割模型的建立)
分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...
- 关于explain
> db.imooc_2.find({x:}).explain() { "queryPlanner" : { , "namespace" : " ...
- python_74_pickle反序列化
import pickle def say(name):#序列化时用完会释放,要想反序列化,要重新写上该函数,否则会出错 print('我的高中', name)#可以和之前的序列化函数不同 f=ope ...
- theano支持的数组、向量、矩阵表达式
1)theano主要支持符号矩阵表达式 (2)theano与numpy中都有broadcasting:numpy中是动态的,而theano需要在这之前就知道是哪维需要被广播.针对不同类型的数据给出如下 ...