详解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 相关文章推荐
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
别了 JavaScript中的isXX系列
Aug 01 Javascript
设置checkbox为只读(readOnly)的两种方式
Oct 11 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
JavaScript实现移动端滑动选择日期功能
Jun 21 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
Apr 10 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
vue.js 实现a标签href里添加参数
Nov 12 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
Mar 07 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 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实现的RSS生成类实例
2015/04/23 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python学习思维导图(必看篇)
2017/06/26 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
一文读懂Python 枚举
2020/08/25 Python
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
业务部主管岗位职责
2014/01/29 职场文书
宿舍标语大全
2014/06/19 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
人民检察院起诉书
2015/05/20 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android