angular 4 http 之web api 服务
Angular Http是获取和保存数据的。主要是为了取到我json文件里的数据。
直接上代码吧:
1. 先介绍Promise模式的:(直接代码)
heroes.json:
|
1
2
3
4
5
6
7
8
|
{ "data": [ { "id": 1, "name": "Windstorm" }, { "id": 2, "name": "Bombasto" }, { "id": 3, "name": "Magneta" }, { "id": 4, "name": "Tornado" } ]} |
http肯定是要有服务的,下面先看service的代码: hero.service.promise.ts:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import { Injectable } from '@angular/core';import { Http, Response } from '@angular/http';import { Headers, RequestOptions } from '@angular/http';import 'rxjs/add/operator/toPromise';import { Hero } from './hero';@Injectable()export class HeroService {//注意这里的路径,找的是app文件下的heroes.json文件 private heroesUrl = 'app/heroes.json'; constructor (private http: Http) {} getHeroes (): Promise<Hero[]> { console.log(this.heroesUrl); return this.http.get(this.heroesUrl) .toPromise() .then(this.extractData) .catch(this.handleError); } private extractData(res: Response) { let body = res.json(); return body.data || { }; } private handleError (error: Response | any) { let errMsg: string; if (error instanceof Response) { const body = error.json() || ''; const err = body.error || JSON.stringify(body); errMsg = `${error.status} - ${error.statusText || ''} ${err}`; } else { errMsg = error.message ? error.message : error.toString(); } console.error(errMsg); return Promise.reject(errMsg); }} |
主要是提供了一个getHeroes ()方法:
下面看hero.component.promise.ts里面怎么用呢:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import { Component, OnInit } from '@angular/core';import { Hero } from './hero';import { HeroService } from './hero.service.promise';@Component({ selector: 'hero-list-promise', templateUrl: './hero-list.component.html', providers: [ HeroService ], styles: ['.error {color:red;}']})export class HeroListPromiseComponent implements OnInit { errorMessage: string; heroes: Hero[]; mode = 'Promise'; constructor (private heroService: HeroService) {} ngOnInit() { this.getHeroes(); } getHeroes() { this.heroService.getHeroes() .then( heroes => this.heroes = heroes, error => this.errorMessage = <any>error); }} |
当然得定义一个hero.ts类:
|
1
2
3
4
5
|
export class Hero { constructor( public id: number, public name: string) { }} |
接下来看一下我们的hero.compoennt.html写什么呢?
|
1
2
3
4
5
|
<h1>Tour of Heroes ({{mode}})</h1><h3>Heroes:</h3><ul> <li *ngFor="let hero of heroes">{{hero.name}}</li></ul> |
就是这么简单。
然后我们在app.compoennt.ts里面引入我们的标签:
|
1
|
<hero-list-promise></hero-list-promise> |
现在最关键的就是在Module.ts中如何配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import { NgModule } from '@angular/core';import { BrowserModule } from '@angular/platform-browser';import { FormsModule } from '@angular/forms';import { HttpModule, JsonpModule } from '@angular/http';import { AppComponent } from './app.component';import { HeroListComponent } from './toh/hero-list.component';import { HeroListPromiseComponent } from './toh/hero-list.component.promise';@NgModule({ imports: [ BrowserModule, FormsModule, HttpModule, JsonpModule, ], declarations: [ AppComponent, HeroListPromiseComponent, ], bootstrap: [ AppComponent ]})export class AppModule {} |
最简单和平常的配置,和往常一样。 2.第二种是web api形式。
有一个文件hero-data.ts(这里就不需要heroes.json文件了)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import { InMemoryDbService } from 'angular-in-memory-web-api';export class HeroData implements InMemoryDbService { createDb() { let heroes = [ { id: 1, name: 'Windstorm' }, { id: 2, name: 'Bombasto' }, { id: 3, name: 'Magneta' }, { id: 4, name: 'Tornado' } ]; return {heroes}; }} |
module.ts需要这样配置:加上:
|
1
2
3
4
5
|
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';import { HeroData } from './hero-data';imports:[ InMemoryWebApiModule.forRoot(HeroData);] |
hero.service.promise.ts里面需要修改下路径就可以。这要修改服务即可,其他的代码勿改动。
|
1
|
private heroesUrl = 'api/heroes'; |
这里已经和heroes.json是没有任何关系了。api是指web api在module.ts里面配置的。angular-in-memory-web-api
heroes是hero-data.ts 里面return 回来的heroes。
这两种得到的结果其实是一样的。
下面说说Observable模式的: 使用都是一样的。
只是服务里的这处代码不一样:
promise模式:
|
1
2
3
4
5
6
7
|
getHeroes (): Promise<Hero[]> { console.log(this.heroesUrl); return this.http.get(this.heroesUrl) .toPromise() .then(this.extractData) .catch(this.handleError);} |
引入的包是这几个:
|
1
|
import 'rxjs/add/operator/toPromise'; |
而Observable模式是这样算的:
|
1
2
3
4
5
|
getHeroes(): Observable<Hero[]> { return this.http.get(this.heroesUrl) .map(this.extractData) .catch(this.handleError);} |
引入:
|
1
2
3
|
import { Observable } from 'rxjs/Observable';import 'rxjs/add/operator/catch';import 'rxjs/add/operator/map'; |
然后就一样了
实际证明直接取Json数据比用web api 快多了
angular 4 http 之web api 服务的更多相关文章
- 延迟调用或多次调用第三方的Web API服务
当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...
- 使用HttpClient对ASP.NET Web API服务实现增删改查
本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序&quo ...
- 使用HttpClient消费ASP.NET Web API服务
本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...
- 构建Web API服务
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 构建动态Web API控制器 ABP可以自动地为应用层生成Web API 层.比如说我们之前创建的应用层: namespace N ...
- RESTFul Web Api 服务框架(一)
简介: 基于 REST 的 Web 服务日益成为后端企业服务集成的首选,因为它比 SOAP 更加简单.这篇文章介绍了一 个简单的可扩展框架,使用Asp.net Web Api作为 REST 服务的实现 ...
- .net core自定义高性能的Web API服务网关
网关对于服务起到一个统一控制处理的作用,也便于客户端更好的调用:通过网关可以灵活地控制服务应用接口负载,故障迁移,安全控制,监控跟踪和日志处理等.由于网关在性能和可靠性上都要求非常严格,所以针对业务需 ...
- VS调试web api服务
vs2013开发web api service时,使用vs开发服务器调试没有问题,但将项目放到另一台电脑调试(vs2010),总会提示 无法再以下端口启动asp.net开发服务器 错误:通常每个套接字 ...
- 记录ASP.NET Web API 服务接口响应时间
实现起来很简单,一个Filter就可以搞定!!! /// <summary> /// 监控接口执行时间 /// </summary> public class TimingAc ...
- Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)
在这篇文章中 概观 演习 概要 由网络营 下载网络营训练包 在传统的Web应用程序中,客户机(浏览器)通过请求页面启动与服务器的通信.然后,服务器处理请求,并将页面的HTML发送给客户端.在与页面的后 ...
随机推荐
- File System 定额(配额查询)
不多说,在弄一个基于FileSytem/IndexedDB的小应用,目前处于基础开发阶段, 我们在使用FileSystem的时候无疑是需要知道浏览器的定额(配额的),怎么去查询,当然可以查询 Quot ...
- Python 学习笔记大纲
Python Basic 第一章:Python基础の快速认识基本语法 (点击进入博客)我的第一个HelloPython程序.如何实现用户输入.Python的自带电池(模块).变量.格式化.条件判断.循 ...
- linux下安装ffmpeg
1. 首先安装系统编译环境 yum install -y automake autoconf libtool gcc gcc-c++ #CentOS 2. 编译所需源码包 #yasm:汇编器,新版 ...
- [转]Django时间查询
1.gt:大于某个时间 now = datetime.datetime.now() 前一天 start = now – datetime.timedelta(hours=23, minutes=59, ...
- top命令参数解析
PID 进程ID USER 进程所有者的用户名 PR 任务优先级 NI nice值.数值越小表示优先级越高,数值越大表示优先越低. VIRT 进程使用的虚拟内存总量,单位kb.VIRT=SWAP+RE ...
- shift+zz保存并退出
shift+z 输出的是大写Z shift+zz就是命令ZZ ZZ 执行退出VIM操作,如果文本已经经过编辑,则首先保存文件.
- Nginx配置文件(2)
一.配置文件结构 1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等. 2 ...
- [PHP] 编译构建最新版PHP源码
获取最新PHP代码git clone https://git.php.net/repository/php-src.git构建编译环境apt-get install build-essential 编 ...
- hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)
题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...