详解AngularJS2 Http服务


Posted in Javascript onJune 26, 2017

关于http服务

HttpModule并不是angular的核心模块,它是一个附加的模块,存在于@angular/http中,虽然如此但是依然可以在需要的时候使用它,只需要在使用之前引入即可。对于大多数app来说使用http服务是很常见的,所以我们将HttpModule加入到AppModule的import列表和应用的根组件中,这样就可以在整个应用中使用http服务了

在自定义服务中使用Http服务

http服务通过其get方法获取数据,他会返回RxJS Observable,我们希望使用的数据是Promise,然而 Observable 并没有toPromise()方法,可以在自定义服务中这样引入

import 'rxjs/add/operator/toPromise';

如此就拓展了Observable的功能了

具体代码如下

import { Injectable }  from '@angular/core';

import { Headers, Http } from '@angular/http';

import 'rxjs/add/operator/toPromise';

import { Hero } from './hero';
 private heroesUrl = 'api/heroes'; // URL to web api

 constructor(private http: Http) { }

 getHeroes(): Promise<Hero[]> {
  return this.http.get(this.heroesUrl)
        .toPromise()
        .then(response => response.json().data as Hero[])
        .catch(this.handleError);
 }

 private handleError(error: any): Promise<any> {
  console.error('An error occurred', error); // for demo purposes only
  return Promise.reject(error.message || error);
 }

在回调函数then()中调用了返回对象的json()方法将data从返回对象中分离出来

.then(response => response.json().data as Hero[])

 这里的.data是因为返回对象中有data这个属性,具体情况下会不一样

注意:Http failure是经常发生的,必须预料到会有异常的可能,所以在方法最后捕获了异常并将其传递给异常处理器,使用Promise.reject()将错误信息返回给服务调用者

利用服务实现数据的增删改查

信息查询

可以在请求url里面带上参数,这样就可以将参数传到后台,服务器查到信息后返回到前台

getHero(id: number): Promise<Hero> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.get(url).toPromise()
   .then(response => response.json().data as Hero)
   .catch(this.handleError);
  }

修改信息

在自定义服务中

private headers = new Headers({'Content-Type': 'application/json'});
  update(hero: Hero): Promise<Hero> {
  const url = `${this.heroesUrl}/${hero.id}`;
  return this.http
  .put(url, JSON.stringify(hero), {headers: this.headers})
  .toPromise()
  .then(() => hero)
  .catch(this.handleError);
}

依然是在url后带上id告知服务器要修改的记录标识,JSON.stringify()将对象转化成json字符串,通过put将字符串放到请求中,header说明了请求体的类型

在调用服务的组件中

save(): void {
   this.heroService.update(this.hero)
    .then(() => this.goBack());
  }

修改成功后返回前一个视图

添加信息

在自定义服务中

create(name: string): Promise<Hero> {
 return this.http
  .post(this.heroesUrl, JSON.stringify({name: name}), {headers: this.headers})
  .toPromise()
  .then(res => res.json().data)
  .catch(this.handleError);
}

删除信息

在自定义服务中

delete(id: number): Promise<void> {
   const url = `${this.heroesUrl}/${id}`;
   return this.http.delete(url, {headers: this.headers})
    .toPromise()
    .then(() => null)
    .catch(this.handleError);
  }

这步只是将后台的信息删除了,但是本地数组中依然存在,所以依然会在视图中显示,所以就要在组建中进行一些处理

delete(hero: Hero): void {
 this.heroService
   .delete(hero.id)
   .then(() => {
    this.heroes = this.heroes.filter(h => h !== hero);
    if (this.selectedHero === hero) { this.selectedHero = null; }
   });
}

这步就是将已经删除的数据从本地数组中过滤掉

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 自定义事件初探
Aug 21 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
vue与bootstrap实现时间选择器的示例代码
Aug 26 Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 Javascript
详解vue中的父子传值双向绑定及数据更新问题
Jun 13 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 Javascript
处理canvas绘制图片模糊问题
May 11 Javascript
详解用node.js实现简单的反向代理
Jun 26 #Javascript
JS作用域链详解
Jun 26 #Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 #jQuery
纯JS实现简单的日历
Jun 26 #Javascript
vue2.0全局组件之pdf详解
Jun 26 #Javascript
JavaScript创建对象的七种方式(推荐)
Jun 26 #Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 #Javascript
You might like
php去除头尾空格的2种方法
2015/03/16 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
php之可变函数的实例详解
2017/09/13 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
在Python的web框架中配置app的教程
2015/04/30 Python
python通过post提交数据的方法
2015/05/06 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
犯错检讨书
2014/02/21 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
工作检讨书怎么写
2014/10/10 职场文书
英语辞职信范文
2015/02/28 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
同意报考证明
2015/06/17 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Python基本知识点总结
2022/04/07 Python