详解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 相关文章推荐
Jquery上传插件 uploadify v3.1使用说明
Jun 18 Javascript
jQuery 计算iframe 窗口大小的方法
May 13 Javascript
javascript实现单击和双击并存的方法
Dec 13 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
vuex学习之Actions的用法详解
Aug 29 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
Dec 08 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
Redux实现组合计数器的示例代码
Jul 04 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
jQuery实现点击图标div循环放大缩小功能
Sep 30 jQuery
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
Jul 21 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操作excel文件 基于phpexcel
2010/07/02 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
简单的分页代码js实现
2016/05/17 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python操作kafka实践的示例代码
2019/06/19 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
python中wheel的用法整理
2020/06/15 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
课程设计心得体会
2013/12/28 职场文书
研究生毕业鉴定
2014/01/29 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书