专栏名称: 前端JavaScript
分享 | 学习 | 交流 | 原创 分享是学习的开始;学习不必要从头开始,是从现在开始;交流能沟通你我,提高你的学识;期待你的加入!!! web前端技术交流,JavaScript,HTML5,CSS3……
目录
相关文章推荐
51好读  ›  专栏  ›  前端JavaScript

【第3章第336】Angular 4.x HttpModule 揭秘

前端JavaScript  · 公众号  · Javascript  · 2017-05-02 07:27

正文

请到「今天看啥」查看全文



(1) 创建 XMLHttpRequest 对象


(2) 设置请求方式和请求 URL 地址


(3) 监听 readyState 状态变化


(4) 判断请求是否完成且请求成功


(5) 把响应体转换为 JSON 对象,并赋值给 members 属性


(6) 发送 HTTP 请求


虽然使用 XMLHttpRequest API 我们也实现了同样的功能,但使用 HttpModule 给我们带来的好处,一目了然。其实 HttpModule 底层实现也是基于 XMLHttpRequest API,只是它对 XMLHttpRequest API 进行了封装,抽象出了 Body、Request、Headers 和 Response 等对象。


HttpModule

请求与响应

HTTP 协议是基于请求与响应,通过 XMLHttpRequest API,我们可以方便的发送 HTTP 请求。相信很多读者已经用过了以下一款或多款 Fiddler、Paw (macOS)、Postman 、Advanced REST client HTTP 客户端,通过它们我们也可以方便的发送 HTTP 请求。其实不管是使用上面的那些 HTTP 客户端还是使用 XMLHttpRequest API,我们最终都是要构造 HTTP 请求报文,然后向服务器发送 HTTP 请求,接着我们就需要接收和解析服务器返回的 HTTP 响应报文,最后根据不同的响应类型解析响应体,进而进行页面渲染。


接下来我们来分析一下前面 Angular Orgs Members - Http 示例中的代码:


export class AppComponent implements OnInit {

members: Member[];

constructor(private http: Http) { }

ngOnInit() {

this.http.get(`https://api.github.com/orgs/angular/members?page=1&per_page=5`)

.map(res => res.json())

.subscribe(data => {

if (data) this.members = data;

});

}

}

首先我们先来分析一下通过构造注入方式,注入的 Http 对象:


constructor(private http: Http) { }

如何创建 Http 对象

angular2/packages/http/src/http_module.ts


@NgModule({

providers: [

{provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions]},

BrowserXhr,

{provide: RequestOptions, useClass: BaseRequestOptions},

{provide: ResponseOptions, useClass: BaseResponseOptions},

XHRBackend,

{provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy},

],

})

export class HttpModule { }

httpFactory 工厂函数


export function httpFactory(

xhrBackend: XHRBackend,

requestOptions: RequestOptions): Http {

return new Http(xhrBackend, requestOptions); // 创建Http对象

}

Http 类构造函数


// angular2/packages/http/src/http.ts 片段

@Injectable()

export class Http {

constructor(protected _backend: ConnectionBackend,

protected _defaultOptions: RequestOptions) {}

}

创建 Http 对象


1.创建 XHRBackend 对象


2.创建 RequestOptions 对象


如何创建 XHRBackend 对象

angular2/packages/http/src/http_module.ts


@NgModule({

providers: [

...,

BrowserXhr, // 等价于 {provide: BrowserXhr, useClass: BrowserXhr}

{provide: ResponseOptions, useClass: BaseResponseOptions},

XHRBackend, // 等价于 {provide: XHRBackend, useClass: XHRBackend}

{provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy},

],

})

export class HttpModule { }

XHRBackend 类


// angular2/packages/http/src/backends/xhr_backend.ts 片段

@Injectable()

export class XHRBackend implements ConnectionBackend {

constructor(







请到「今天看啥」查看全文