Angular2学习笔记四(之Http通信)
前言:
在这里,我描述三个场景,即系统的注册与登录,及登录后的操作:
1、注册场景,前端页面传入用户名密码,通过一个api接口传到后台,在后台对这用户及密码进行保存;
2、登录场景,前端用户传入用户名及密码,通过api接口传到后台,在后台进行配对,如果配对成功,则在后台派发(返回)一个令牌(id_token,下同),通过这个令牌作为用户已经登录的唯一凭证,需要保存到用户本地存储(localStorage),以后作后续操作;
3、登录后操作,当用户需要授权操作时,那么首先得获取本地存储(localStorage)中的令牌,将令牌传到后台,如果匹配成功,则允许操作,否则不允许操作。
以后三个场景大体描述了一个系统注册登录的思路。下面,我将从这三个思路出发,讲述Angular2中http与后台通信的过程。
前期准备:
在继续之前,我们需要一些准备工作,即创建一个后台服务,包括注册、登录及查询这三个接口,这里包括有三个接口分别如下:
http://localhost:3001/users
http://localhost:3001/sessions/create
http://localhost:3001/api/protected/random-quote
下载及方法:
git clone https://github.com/auth0/nodejs-jwt-authentication-sample.git
npm install
node server.js
按照上面的步骤,后台服务就算准备完成,可以继续往下看了。
接下来,创建界面元素post-component.html:
<form (ngSubmit)="register(registerForm.value)" #registerForm="ngForm">
<div class="text-center">
<h2>注册</h2>
</div>
<div class="form-group">
<label for="username">Name</label>
<input type="text" class="form-control" id="username" required [(ngModel)]="model.username" name="username">
</div>
<div class="form-group">
<label for="password">Alter Ego</label>
<input type="text" class="form-control" id="password" required [(ngModel)]="model.password" name="password">
</div>
<button type="submit" class="btn btn-success">Submit</button>
</form>
<form (ngSubmit)="onLogin(loginForm.value)" #loginForm="ngForm">
<div class="text-center">
<h2>登录</h2>
</div>
<div class="form-group">
<label for="username2">Name</label>
<input type="text" class="form-control" id="username2" required [(ngModel)]="model.username2" name="username2">
</div>
<div class="form-group">
<label for="password2">Alter Ego</label>
<input type="text" class="form-control" id="password2" required [(ngModel)]="model.password2" name="password2">
</div>
<button type="submit" class="btn btn-success">Submit</button>
</form>
<button id="input" (click)="getSecretQuote()">登录之后才能获取数据</button>
接下来创建PostComponent.ts组件:
@Component({
selector: 'post-client',
templateUrl: './post-component.html',
})
export class PostComponent {
model: any;
constructor(private http: Http) {
this.model = {};
}
//把代码写这里啦
}
这样,我们就已经创建好工作区模板
再准备准备
在进行之前,我们看下angular2中,http api方法的传参数形式:
http.get(url: string, options?: RequestOptionsArgs) : Observable<Response>
http.post(url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
可以看到,根据其参数url地址, body:any及options?: RequestOptionsArgs参数来提交对应的数据信息,其中body表示传递到服务器端的数据信息,options表示头部验证信息。两个方法都返回一个可观察对象Observable,我们可以通过subscribe方法得到里面的值并作后继处理。这样,我们可以得到以下代码处理方法
this.http.post(url: string, body: any, options?: RequestOptionsArgs).subscribe(function (data) {
console.log(data)
})
结果处理之可观察对象Observable:
我们通过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.http.post(url: string, body: any, options?: RequestOptionsArgs).map((rsp:Response)=>{
return rsp.json()
})
.subscribe((data) => {
console.log(data);
});
注意,这里.map用到了rxjs库,需要导入这个库。
结果处理之Promise:
虽然 Angular 的 http 客户端 API 返回的是 Observable<Response> 类型的对象,但我们也可以把它转成 Promise<Response>。这很容易,只需要调用可观察对象 Observable< Response >的方法toPromise()就能够进行转化。
this.http.post(url: string, body: any, options?: RequestOptionsArgs).toPromise()
.then((rsp: Response) => {
console.log(rsp)
});
注册
通过上面的讲述,现在执行http通信也变得简单多了。上代码
register(data) {
var username = data.username;
var password = data.password;
var body = "username=" + username + "&password=" + password + "&extra=color";
var headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post('http://localhost:3001/users', body, {
headers: headers
})
.map(res => res.json())
.subscribe(
data => console.log(data),
err => console.log(err),
() => console.log('Register Complete')
);
}
Angular2学习笔记四(之Http通信)的更多相关文章
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
随机推荐
- hackerrank 训练军队
高阶传送魔法 在神奇的Kasukabe国家,人们努力拥有一个技能.一共有N个类型的技能,并且开始的时候拥有第 i 种技能的人有Ci个 . 这个国家有T个巫师,他们有能力将一个人的技能进行转换.每个巫师 ...
- HDU2243 考研路茫茫――单词情结
Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab&q ...
- c语言基础学习04
=============================================================================涉及到的知识点有:程序的三种结构.条件分支语句 ...
- HDU 2544 最短路(模板题——Floyd算法)
题目: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你 ...
- 一致性哈希java实现
值得注意的点 哈希函数的选择 murmur哈希函数 该函数是非加密型哈希,性能高,且发生哈希碰撞的概率据说很低 md5 SHA 可以选择guava包,提供了丰富的哈希函数的API 支持虚拟节点+加权, ...
- 坑爹的file_exists
介绍 我发现了一个问题,今天与大家分享.我把整个过程描述一下. 问题 公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错 ...
- ProtoBuf 与 gRPC
用 Protobuf 很久了,但是一直觉得很简单,所以就没有做一个总结,今天想尝试一下 gRPC,顺带就一起总结一下.ProtoBuf 是个老同志了,应该是 2010 的时候发布的,然后被广泛使用,目 ...
- QT5 Thread线程
QT5 Thread线程继承QThread方式 一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密 QTimer *t = new QTimer(*parent); //创建Q ...
- asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录
一.先从M部分写起(Modles\DAL\BLL) 1.Modles 实体类:上次实体类已经搞定. 2.DAL 数据访问类类 (1)通用数据数据访问类: A: 先编写数据连接字符串,写到网站根目录W ...
- asp.net -mvc框架复习(10)-基于三层架构与MVC搭建项目框架
一.三种模式比较 1.MVC框架(适合大型项目) (1).V视图 (网页部分) (2).M模型 (业务逻辑+数据访问+实体类) (3).C控制器 (介于M和V之间,起到引导作用) 2.三层架构 (1) ...