详解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 相关文章推荐
用dtree实现树形菜单 dtree使用说明
Oct 17 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
Javascript中With语句用法实例
May 14 Javascript
JavaScript实现可拖拽的拖动层Div实例
Aug 05 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
React学习笔记之列表渲染示例详解
Aug 22 Javascript
vue+node+webpack环境搭建教程
Nov 05 Javascript
JS自定义滚动条效果
Mar 13 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
在vs2010中调试javascript代码方法
2011/02/11 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
详解python基础之while循环及if判断
2017/08/24 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
Python实现对adb命令封装
2020/03/06 Python
python代码xml转txt实例
2020/03/10 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
软件测试题目
2013/02/27 面试题
党章学习思想汇报
2014/01/14 职场文书
春节请假条
2014/04/11 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
如何正确理解python装饰器
2021/06/15 Python
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏