更新 : 2017-06-08 

总觉得 angular 的 http 怎么就多了 Request, Headers, Response 这些麻烦东东呢.

原来这些都是游览器的“新特性” Fetch API. 其实很久了,只是我不知道而已,哈哈。

Fetch API 和以前的 xmlhttprequest 主要功能是一样的,就是发请求.

不同的地方是Fetch 是基于 promise 的,而且可以配合 service worker, stream, cache 之类的 "新特性" 打出连环计.

它也是有不足的地方,比如没办法 abort 和 progress (不确定目前有了没有 /.\)

有兴趣的朋友可以多留意这些 "新特性" 哦.

refer :

https://angular.cn/docs/ts/latest/guide/server-communication.html

https://xgrommx.github.io/rx-book/index.html

http://wiki.jikexueyuan.com/project/android-weekly/issue-145/introduction-to-RP.html

概念上没什么太多的区别.

下面记入一些例子和小区别 :

不同的地方 :

1.不支持 ng1 的 interceptor 拦截和 transformations (要自己实现可以试着继承 http 服务来扩展)

2.默认结合rxjs (也可以很容易的转化回熟悉的 Promise)

提醒:

1.XSRF 和 ng1 一模一样

2.ng 有一个内存 WebAPI 服务 ( in-memory web api service ),可以模拟后端的 Web API 服务器. 不过我没有用 ^^".

例子 :

1.Headers and Params

let headers = new Headers({ "myHeader": "myValue" });
headers.append("Accept", "application/json");
let params = new URLSearchParams();
params.set('myParam', 'myValue');
let options = new RequestOptions({ headers: headers, search: params });
this.http.get("/api/products", options).toPromise().then((response) => {
console.log(response.json());
});

2.POST

let body = JSON.stringify({
code : "mk200"
});
let headers = new Headers({ 'Content-Type': 'application/json' }); //其实不表明 json 也可以, ng 默认好像是 json
let options = new RequestOptions({ headers: headers });
this.http.post("/api/products", body, options).toPromise().then((response) => {
//do something...
});

3.get CSV

let options = new RequestOptions({ responseType: ResponseContentType.Text });
this.http.get("/demo.csv", options).toPromise().then((response) => {
console.log(response.text());
});

4.by request

let options = new RequestOptions({
method: RequestMethod.Post,
url: "/api/products",
headers: new Headers({ 'Content-Type': 'application/json' }),
body: JSON.stringify({ code: "mk200" })
});
this.http.request(new Request(options)).toPromise().then((response) => {
//do something...
});

5. Upload file

<input type="file" (change)="onFileChanged($event.target.files)" placeholder="Upload file" accept="image/*">
onFileChanged(fileList: FileList) {
if (fileList.length > 0) {
let file: File = fileList[0];
let formData: FormData = new FormData();
formData.append('uploadFile', file, file.name);
let headers = new Headers({
"Accept": "application/json"
});
let options = new RequestOptions({ headers });
this.http.post("https://localhost:44372/api/uploadFile", formData, options)
.map(res => res.json())
.catch(error => Observable.throw(error))
.subscribe(
data => console.log('success' + data),
error => console.log(error)
)
}
}

ng 支持 formData, 关键就是别自己去写 Content-Type header, ng 会帮我们写好的.

拦截

不像 ng1 那样,ng 并没有给我们一个拦截的接口, 不过我们可以通过简单的继承+override 来达到目的.

refer : http://stackoverflow.com/questions/34934009/handling-401s-globally-with-angular-2

import { Injectable } from '@angular/core';
import { Http as NgHttp, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response } from "@angular/http"; import { Observable } from "rxjs/Observable"; @Injectable()
export class Http extends NgHttp {
constructor(backend: XHRBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
get(url: string, options?: RequestOptionsArgs): Observable<Response>
{
console.log("in");
return super.get(url,options);
} request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {    
console.log("in2");
return super.request(url, options).catch((error: Response) => {
console.log(error);
return Observable.throw(error);
});
}
}

get,post,put,delete 最终也是会调用 request 方法, 所以我们可以在 request 做大部分的拦截.

typescript 中 override 父类方法不需要写什么 virtual, override 之类的, 直接写方法就可以了, 内部通过 super.method() 来调用父类方法, 不是 super() 哦.

我们有 2 个选择来调用这个 http, 第一就是声明我们的 service, 其二是覆盖 ng 的 Http service.

import { Http as StoogesHttp } from "./http.service";
import { Http } from "@angular/http"; @NgModule({
imports: [StoogesModule, DebugRoutingModule],
exports: [],
declarations: [DebugComponent],
providers: [{ provide : Http, useClass : StoogesHttp }] //这样就覆盖掉了. 可以参考我写的 angular2 依赖注入
})
export class DebugModule { }

angular2 学习笔记 ( Http 请求)的更多相关文章

  1. Django:学习笔记(4)——请求与响应

    Django:学习笔记(4)——请求与响应 0.URL路由基础 Web应用中,用户通过不同URL链接访问我们提供的服务,其中首先经过的是一个URL调度器,它类似于SpringBoot中的前端控制器. ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. angular2 学习笔记 ( rxjs 流 )

    RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅,  ...

  4. Angular2学习笔记(1)——Hello World

    1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...

  5. angular2 学习笔记 ( Form 表单 )

    refer : https://angular.cn/docs/ts/latest/guide/forms.html https://angular.cn/docs/ts/latest/cookboo ...

  6. angular2 学习笔记 ( ngModule 模块 )

    2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...

  7. Angular2学习笔记四(之Http通信)

    前言: 在这里,我描述三个场景,即系统的注册与登录,及登录后的操作: 1.注册场景,前端页面传入用户名密码,通过一个api接口传到后台,在后台对这用户及密码进行保存: 2.登录场景,前端用户传入用户名 ...

  8. angular2 学习笔记 ( 状态管理 state management )

    更新 : 2017-12-29  ng5 移除 zone.js https://zhuanlan.zhihu.com/p/29577461 zone 的用途就是拦截游览器事件, 比如 click, a ...

  9. Tornado学习笔记(三) 请求方式/状态码

    本章我们来学习 Tornado 支持的请求方式 请求方式 Tornado支持任何合法的HTTP请求(GET.POST.PUT.DELETE.HEAD.OPTIONS).你可以非常容易地定义上述任一种方 ...

随机推荐

  1. Windows环境下python多版本配置方案

    系统环境 Windows,安装了msys2,windows和msys2都安装了python,且版本比较多,使用shell/bash聚合工具conemu64 配置方案 配置msys2环境用户目录下的.b ...

  2. 小学生玩ACM----深搜

    Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  3. POJ 3414 Pots ( BFS , 打印路径 )

    题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...

  4. navigaitonBar的自定义设置

    navigaitonBar的自定义设置 navigationBar介绍: navigationbar就是一个导航视图控制器上面的导航栏. 如何设置这个navigationbar? 首先我们来探讨如何来 ...

  5. 2015 南阳ccpc The Battle of Chibi (uestc 1217)

    题意:给定一个序列,找出长度为m的严格递增序列的个数. 思路:用dp[i][j]表示长度为i的序列以下标j结尾的总个数.三层for循环肯定超时,首先离散化,离散化之后就可以用树状数组来优化,快速查找下 ...

  6. HDU 5033 Building(单调栈维护凸包)

    盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...

  7. 一些 Windows 系统不常见的 鼠标光标常数

    一些 Windows  系统不常见的 鼠标光标常数 Private Declare Function SetCursor Lib "user32" (ByVal hCursor A ...

  8. 关于uploadify无法起作用,界面没有效果出现

    <link href="<%: Url.Content("~/Res/uploadify/uploadify.css") %>" rel=&q ...

  9. Android之使用json进行网络数据交换

    JSON作为一种轻量级的数据交换格式,凭借其易于阅读和编写.易于解析.传输速度快等优点流行了起来.最近正好在学习Android端从服务端端取数据,Json便派上了用场.好,下面开始切入主题. 1.准备 ...

  10. Android 的 Relative Layout 常量

    android:layout_above 将该控件的底部置于给定ID的控件之上                    --Rule that aligns a child's bottom edge ...