Angular2 http jsonp的实例详解


Posted in Javascript onAugust 31, 2017

Angular2 Http

1. 使用Http

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

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方法来执行http get方法获取数据,该方法的调用形式如下

get(url: string, 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/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方法来执行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对应的方法,当数据返回后进行处理。

4. JSONP获取数据

用 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); 

}); 

} 

}

5. 结果处理

5.1 可观察对象

我们通过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); 

});

5.2 Promise

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

this.jsonp.get(this.url) 

.toPromise() 

.then((rsp: Response) => { 

console.log(rsp) 

});

以上就是对Angular http json的讲解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
JavaScript对象模型-执行模型
Apr 28 Javascript
Jquery同辈元素选中/未选中效果的实例代码
Aug 01 Javascript
jQuery点缩略图弹出层显示大图片
Feb 13 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
详解vue 配合vue-resource调用接口获取数据
Jun 22 Javascript
Angular模板表单校验方法详解
Aug 11 Javascript
node.js基于express使用websocket的方法
Nov 09 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 #Javascript
Cpage.js给组件绑定事件的实现代码
Aug 31 #Javascript
基于canvas粒子系统的构建详解
Aug 31 #Javascript
Vue 组件间的样式冲突污染
Aug 31 #Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 #Javascript
JavaScript基础之流程控制语句的用法
Aug 31 #Javascript
jquery操作ul的一些操作笔记整理(干货)
Aug 31 #jQuery
You might like
支持oicq头像的留言簿(一)
2006/10/09 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
vue中v-model的应用及使用详解
2018/06/27 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
详解supervisor使用教程
2017/11/21 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
酒店管理求职信范文
2014/04/06 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
毕业论文致谢范文
2015/05/14 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
婚宴来宾致辞
2015/07/28 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript