angular2 http jsonp

Angular2Http

1.使用Http

绝大部分应用程序都会和后台服务打交道,Http是浏览器和服务器之间通讯的主要协议,通过Http调用来访问远程服务器上相应的WebAPI。

HttpModule并不是Angular的核心模块,通过Angular包中一个名叫@angular/http的独立附属模块发布了出来。我们的应用将会依赖于Angular的http服务,它本身又依赖于其它支持类服务。来自@angular/http库中的HttpModule保存着这些HTTP相关服务提供商的全集。

现代浏览器支持两种基Http的API:XMLHttpRequest(XHR)和JSONP。少数浏览器还支持Fetch。在Angular中分别对应@angular/http库中的HttpModule和JsonpModule两个模块。

2.GET获取数据

为了能够使用XHR中的Get方法来获取数据信息,我们把HttpModule添加到AppModule的imports列表中,这样本应用程序的任何地方都可以访问XHR服务。

我们使用Http服务的实例中的get方法来执行httpget方法获取数据,该方法的调用形式如下

get(url:string,options?:RequestOptionsArgs):Observable<Response>

来看一个简单的例子,代码如下

@Component({

selector:'demo',

template:'<buttonid="input"(click)="click()">GetData</button>',

})

exportclassDemoComponent{

constructor(privatehttp: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对应的方法,当数据返回后进行处理。

3.POST发送数据

同样的,为了能够使用XHR中的POST方法来获取数据信息,我们把HttpModule添加到AppModule的imports列表中,这样本应用程序的任何地方都可以访问XHR服务。

我们使用Http服务的实例中的post方法来执行httppost方法获取数据,该方法的调用形式如下

post(url:string,body:any,options?:RequestOptionsArgs):Observable<Response>

来看一个简单的例子,代码如下

@Component({

selector:'demo',

template:'<buttonid="input"(click)="click()">GetData</button>',

})

exportclassDemoComponent{

constructor(privatehttp:Http){

}

url:string='/api/post';

click(){

letheaders=newHeaders({'Content-Type':'application/json'});

letoptions=newRequestOptions({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对应的方法,当数据返回后进行处理。

4.JSONP获取数据

用AngularHttp服务发起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>

我们来看一个例子,该示例和HttpGet访问十分类似,

@Component({

selector:'demo',

template:'<buttonid="input"(click)="click()">GetData</button>',

})

exportclassDemoComponent{

constructor(privatejsonp:Jsonp){

}

url:string='/api/list';

click(){

this.jsonp.get(this.url).subscribe((data)=>{

console.log(data);

});

}

}

5.结果处理

5.1可观察对象

我们通过Http以及Jsonp的api接口可以知道,默认返回值都是可观察对象Observable<Response>。可以把可观察对象Observable看做一个由某些“源”发布的事件流。通过订阅到可观察对象Observable,我们监听(subscribe)这个流中的事件。在这些订阅中,我们指定了当Web请求生成了一个成功事件(有效载荷是英雄数据)或失败事件(有效载荷是错误对象)时该如何采取行动,如示例中所示。

我们的服务可以返回HTTP响应对象Response。但这可不是一个好主意!数据服务的重点在于,对消费者隐藏与服务器交互的细节。其实上,我们最关心的还是获取到的返回数据信息,这时候我们就可以利用RxJS库来对事件流进行一些额外的处理。

RxJS("ReactiveExtensions"的缩写)是一个被Angular认可的第三方库,它实现了异步可观察对象(asynchronousobservable)模式。Rxjs库中包含很多对事件流进行处理的方法,例如map,distinctUntilChanged等操作符。

针对返回数据是json格式的响应对象,可以把Response解析成JavaScript对象——只要调一下response.json()就可以了,这时候我们就可以利用map操作符来进行处理,例如

this.jsonp.get(this.url)

.map((rsp:Response)=>{

returnrsp.json()

})

.subscribe((data)=>{

console.log(data);

});

5.2Promise

虽然Angular的http客户端API返回的是Observable<Response>类型的对象,但我们也可以把它转成Promise<Response>。这很容易,只需要调用可观察对象Observable<Response>的方法toPromise()就能够进行转化。例如

this.jsonp.get(this.url)

.toPromise()

.then((rsp:Response)=>{

console.log(rsp)

});

相关推荐