angular2中Http请求原理与用法详解


Posted in Javascript onJanuary 11, 2018

本文实例讲述了angular2中Http请求原理与用法。分享给大家供大家参考,具体如下:

提供HTTP服务

HttpModule并不是Angular的核心模块。 它是Angular用来进行Web访问的一种可选方式,并位于一个名叫@angular/http的独立附属模块中.

编辑app.module.ts

import { HttpModule, JsonpModule } from '@angular/http';
@NgModule({
 imports: [
  HttpModule,
  JsonpModule
 ],
})

angular-in-memory-web-api

npm install angular-in-memory-web-api --save-dev

This in-memory web api service processes an HTTP request and returns an Observable of HTTP Response object in the manner of a RESTy web api.

:base/:collectionName/:id?
GET api/heroes     // all heroes
GET api/heroes/42    // the character with id=42
GET api/heroes?name=^j // 'j' is a regex; returns heroes whose name starting with 'j' or 'J'
GET api/heroes.json/42 // ignores the ".json"

之前测试时用的app/mock/user_data_memory_mock.ts数据

import {User} from '../model/User';
import { InMemoryDbService } from 'angular-in-memory-web-api';
export class UserDataMemoryMock implements InMemoryDbService{
 createDb() {
  const users: User[] = [
    new User('chenjianhua_a', 21, '2290910211@qq.com', '123456'),
    new User('chenjianhua_b', 22, '2290910211@qq.com', '123456'),
    new User('chenjianhua_c', 23, '2290910211@qq.com', '123456'),
    new User('chenjianhua_d', 24, '2290910211@qq.com', '123456'),
    new User('chenjianhua_e', 25, '2290910211@qq.com', '123456'),
    new User('chenjianhua_f', 26, '2290910211@qq.com', '123456'),  
  ];
  return {users};
 }
}

编辑app.module.ts

import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
import { UserDataMemoryMock } from './mock/user_data_memory_mock';
@NgModule({
 imports: [
  InMemoryWebApiModule.forRoot(UserDataMemoryMock),
 ]
})

导入InMemoryWebApiModule并将其加入到模块的imports数组。 InMemoryWebApiModule将Http客户端模拟的后端服务
forRoot()配置方法需要UserMemoryMockService类实例,用来向内存数据库填充数据

编辑app/service/user.restful.service.ts

import {Injectable} from '@angular/core';
import { Headers, Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { User } from '../model/User';
import { Logger } from './logger.service';
@Injectable()
export class UserService {
  private USERURL = 'api/users';
  private headers = new Headers({'Content-Type': 'application/json'});
  constructor(private Log: Logger,
  private http: Http) { }
  getUserByName(name: string): Promise<User> {
  const url = `${this.USERURL}/?name=${name}`;
  return this.http.get(url)
    .toPromise()
    .then(response => response.json().data as User)
    .catch(this.handleError);
  }
  getUsers(): Promise<User[]> {
    console.log('Get User!');
    return this.http.get(this.USERURL)
    .toPromise()
    .then(response => response.json().data as User[])
    .catch(this.handleError);
  }
  create(name: string): Promise<User> {
  return this.http
    .post(this.USERURL, JSON.stringify({name: name}), {headers: this.headers})
    .toPromise()
    .then(res => res.json().data as User)
    .catch(this.handleError);
  }
  private handleError(error: any): Promise<any>{
    console.log('An error occurred :', error);
    return Promise.reject(error.message);
  }
}

编辑app/components/app-loginform/app.loginform.ts

import { Component, OnInit } from '@angular/core';
import { Logger } from '../../service/logger.service';
import { UserService } from '../../service/user.restful.service';
import { User } from '../../model/User';
import { Subject } from 'rxjs/Subject';
@Component({
 selector: 'app-loginform',
 templateUrl: './app.loginform.html',
 styleUrls: ['./app.loginform.css'],
 providers: [
  Logger,
  UserService
 ]
})
export class AppLoginFormComponent implements OnInit {
  users: User[];
  submitted = false;
  model = new User('1', 'fangfang', 22, '2290910211@qq.com', '123456');
  constructor(
    private Log: Logger,
    private userService: UserService
  ){}
  ngOnInit(): void{
    this.userService
    .getUsers()
    .then( users => this.users = users);
  }
  onSubmit(): void {
    this.userService.getUserByName(this.model.name)
    .then( user => {
      console.log('user.name', user[0].name);
      console.log('user.password', user[0].password);
      if(user[0].name === this.model.name
      && user[0].password === this.model.password){
        this.Log.log('login success!');
        this.submitted = true;
      }else{
        this.Log.log('login failed!');
        this.submitted = false;
      }
    })
    .catch(errorMsg => console.log(errorMsg));
  }
}

HTTP Promise

Angular 的http.get返回一个 RxJS 的Observable对象。 Observable是一个管理异步数据流的强力方式。

现在,我们先利用toPromise方法把Observable直接转换成Promise对象

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
HTML node相关的一些资料整理
Jan 01 Javascript
Jquery上传插件 uploadify v3.1使用说明
Jun 18 Javascript
jQuery 获取兄弟元素的几种不错方法
May 23 Javascript
深入理解JavaScript定时机制
Oct 27 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
React组件之间的通信的实例代码
Jun 27 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
vue绑定事件后获取绑定事件中的this方法
Sep 15 Javascript
深入解析koa之中间件流程控制
Jun 17 Javascript
jQuery实现全选按钮
Jan 01 jQuery
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
基于node下的http小爬虫的示例代码
Jan 11 #Javascript
JS脚本实现网页自动秒杀点击
Jan 11 #Javascript
Javascript网页抢红包外挂实现分享
Jan 11 #Javascript
JS写谷歌浏览器chrome的外挂实例
Jan 11 #Javascript
React 高阶组件入门介绍
Jan 11 #Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 #Javascript
Router解决跨模块下的页面跳转示例
Jan 11 #Javascript
You might like
xajax写的留言本
2006/11/25 PHP
php 表单验证实现代码
2009/03/10 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
浅谈五大Python Web框架
2017/03/20 Python
python先序遍历二叉树问题
2017/11/10 Python
Python异常处理操作实例详解
2018/05/10 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
python多进程使用函数封装实例
2020/05/02 Python
Pycharm修改python路径过程图解
2020/05/22 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
企业宣传语大全
2015/07/13 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang