绝大部分应用程序都会和后台服务打交道,Http是浏览器和服务器之间通信的主要协议,经过Http调用来访问远程服务器上相应的 Web API。json
HttpModule
并非 Angular 的核心模块,经过Angular包中一个名叫 @angular/http
的独立附属模块发布了出来。咱们的应用将会依赖于Angular的 http
服务,它自己又依赖于其它支持类服务。来自 @angular/http
库中的 HttpModule
保存着这些 HTTP 相关服务提供商的全集。api
现代浏览器支持两种基Http的API : XMLHttpRequest (XHR) 和 JSONP 。少数浏览器还支持 Fetch 。在Angular中分别对应@angular/http
库中的HttpModule
和JsonpModule两个模块。浏览器
为了可以使用XHR中的Get方法来获取数据信息,咱们把 HttpModule
添加到 AppModule
的 imports
列表中,这样本应用程序的任何地方均可以访问XHR服务。安全
咱们使用Http服务的实例中的get方法来执行http get方法获取数据,该方法的调用形式以下服务器
get(url: string, options?: RequestOptionsArgs) : Observable<Response>网络
来看一个简单的例子,代码以下app
@Component({异步 selector: 'demo',async template: '<button id="input" (click)="click()">Get Data</button>',函数 }) export class DemoComponent { constructor(private http: Http) { } url: string = '/api/list'; click() { this.http.get(this.url).subscribe(function (data) { console.log(data) }) } } |
咱们在DemoComponent构造函数中采用DI获取了Http服务的实例http,当点击获取数据的按钮后,便可以经过Http实例中的get方法,根据其参数url地址及options?: RequestOptionsArgs参数来获取对应的数据信息。该方法返回的是一个可观察对象 (Observable),针对可观察对象,咱们能够subscribe对应的方法,当数据返回后进行处理。
一样的,为了可以使用XHR中的POST方法来获取数据信息,咱们把 HttpModule
添加到 AppModule
的 imports
列表中,这样本应用程序的任何地方均可以访问XHR服务。
咱们使用Http服务的实例中的post方法来执行http post方法获取数据,该方法的调用形式以下
post(url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
来看一个简单的例子,代码以下
@Component({ selector: 'demo', template: '<button id="input" (click)="click()">Get Data</button>', }) export class DemoComponent { constructor(private http: Http) { } url: string = '/api/post'; click() { let headers = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers }); this.http.post(this.url, JSON.stringify({ 'id': '1' }), options).subscribe(function (data) { console.log(data) }) } } |
咱们在DemoComponent构造函数中采用DI获取了Http服务的实例http,当点击获取数据的按钮后,便可以经过Http实例中的get方法,根据其参数url地址, body:any及options?: RequestOptionsArgs参数来提交对应的数据信息,其中body表示传递到服务器端的数据信息。示例中,咱们传递json格式的数据到服务器端,因此使用了'Content-Type': 'application/json'头信息进行包装。
该方法返回的是一个可观察对象 (Observable),针对可观察对象,咱们能够subscribe对应的方法,当数据返回后进行处理。
用 Angular Http 服务发起 XMLHttpRequests,是与服务器通信时最经常使用的方法。但它不适合全部场景。
出于安全的考虑,网络浏览器会阻止调用与当前页面不“同源”的远端服务器的XHR。所谓源就是 URI 的协议 (scheme) 、主机名 (host) 和端口号 (port) 这几部分的组合。这被称为同源策略。
为了能够向不一样源的服务器发起 XHR 请求,这时候就须要支持一种老的、只读的 ( 译注:即仅支持 GET) 备选协议,这就是 JSONP。
为了可以使用JSONP中的Get方法来获取数据信息,咱们把 JsonpModule 添加到 AppModule
的 imports
列表中,这样本应用程序的任何地方均可以访问Jsonp服务。
Angular的Jsonp服务不但经过JSONP 扩展了Http 服务,并且限制咱们只能用GET请求,调用的形式以下。
get(url: string, options?: RequestOptionsArgs) : Observable<Response>
咱们来看一个例子,该示例和Http Get访问十分相似,
@Component({ selector: 'demo', template: '<button id="input" (click)="click()">Get Data</button>', }) export class DemoComponent { constructor(private jsonp: Jsonp) { } url: string = '/api/list'; click() { this.jsonp.get(this.url).subscribe((data) => { console.log(data); }); } } |
咱们经过Http以及Jsonp的api接口能够知道,默认返回值都是可观察对象 Observable<
Response >。
能够把可观察对象 Observable 看作一个由某些“源”发布的事件流。 经过 订阅 到可观察对象 Observable ,咱们监听(subscribe)这个流中的事件。 在这些订阅中,咱们指定了当 Web 请求生成了一个成功事件 ( 有效载荷是英雄数据 ) 或失败事件 ( 有效载荷是错误对象 ) 时该如何采起行动,如示例中所示。
咱们的服务能够返回 HTTP 响应对象Response。但这可不是一个好主意! 数据服务的重点在于,对消费者隐藏与服务器交互的细节。其实上,咱们最关心的仍是获取到的返回数据信息,这时候咱们就能够利用RxJS库来对事件流进行一些额外的处理。
RxJS("Reactive Extensions" 的缩写)是一个被 Angular 承认的第三方库,它实现了异步可观察对象 (asynchronous observable) 模式。Rxjs库中包含不少对事件流进行处理的方法,例如map,distinctUntilChanged等操做符。
针对返回数据是json格式的响应对象,能够把Response解析成 JavaScript 对象——只要调一下 response.json() 就能够了,这时候咱们就能够利用map操做符来进行处理,例如
this.jsonp.get(this.url) .map((rsp:Response)=>{ return rsp.json() }) .subscribe((data) => { console.log(data); }); |
虽然 Angular 的 http 客户端 API 返回的是 Observable<Response> 类型的对象,但咱们也能够把它转成 Promise<Response>。这很容易,只须要调用可观察对象 Observable<
Response >的方法
toPromise()就可以进行转化。例如
this.jsonp.get(this.url) .toPromise() .then((rsp: Response) => { console.log(rsp) }); |