angular 的 http 多了 Request, Headers, Response ,这些都是游览器的“新特性” Fetch API.

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

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

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 服务器. 不过我没有用 ^^".

例子 :

一、request

注意: get,post,put,delete 最终也是会调用 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...
});

二、具体方法

1.get

1.1、参数和请求头

代码
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());
});

1.2、get CSV

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

2.POST

2.1、普通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...
});

2.2、上传文件

<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 会帮我们写好的.

三、拦截

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 {

}

请求方式:request和 get、post、put的更多相关文章

  1. IOS 网络请求方式

    iOS开发中的网络请求   今天来说说关于iOS开发过程中的网络请求. 关于网络请求的重要性我想不用多说了吧.对于移动客户端来说,网络的重要性不言而喻.常见的网络请求有同步GET, 同步POST, 异 ...

  2. 请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式

    遇到一个问题 在一个地址链接(URL)里使用 url?param1=val1&param2=val2 的方式传递参数,结果在获取参数值时发现不是当初设定的值. 具体案例 以特殊字符井号(#)为 ...

  3. Ajax中的get和post两种请求方式的异同

    Ajax中我们经常用到get和post请求.那么什么时候用get请求,什么时候用post方式请求呢? 在做回答前我们首先要了解get和post的区别.   1. get是把参数数据队列加到提交表单的A ...

  4. jQuery中的Ajax几种请求方式

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...

  5. HttpwebClient的四种请求方式

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.      本文旨在发布代码,供自己参考,也供大家参考,谢谢. 正题: Ht ...

  6. react native 网络get请求方式参数不可为undefined或null

    react native 网络get请求方式参数不可为undefined(为空的话默认变为)或null 错误写法: export function addToCartAction(isRefreshi ...

  7. http常见的get请求方式和set请求方式。

    一.Get请求方式 以下是我写的一个用get请求方式获取api工厂中汇率的类. package com.example; import java.io.BufferedReader; import j ...

  8. Ajax的get和post两种请求方式区别

    Ajax的get和post两种请求方式区别 (摘录):http://ip-10000.blog.sohu.com/114437748.html 解get和post的区别. 1. get是把参数数据队列 ...

  9. YII2 请求(request)

    请求 一个应用的请求是用 yii\web\Request 对象来表示的,该对象提供了诸如 请求参数(译者注:通常是GET参数或者POST参数).HTTP头.cookies等信息. 默认情况下,对于一个 ...

  10. SpringMVC的REST风格的四种请求方式

    一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET  ====== 获 取资源 2.POST ======新建资源 ...

随机推荐

  1. 【MyBatis】MyBatis自动生成代码查询之爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  2. Spark2.1.0官方文档

    Spark 概述 Apache Spark是一个快速和通用的集群计算系统.它提供Java,scala,Python.R语言的APIs,以及支持一般执行图形的优化引擎. 它还支持一组丰富的高级工具,包括 ...

  3. Linux shell 脚本(三)

    转载请标明出处:  http://blog.csdn.net/zwto1/article/details/45111547:  本文出自:[zhang_way的博客专栏] 九.使用case 分支 语法 ...

  4. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

    思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域 方法:命令行参数启动浏览器后添加参数--disable-web-security 例:chrome --disable-we ...

  5. 初识Selenium以及Selenium常用工具的简单介绍

    一.为什么要学习自动化测试? 在互联网行业中敏捷开发小步快跑,快速迭代,测试环节中回归测试任务大繁琐,手工测试容易漏测,自动化测试可以提高测试效率保证产品质量. 二.学习的层次模型 1.单元自动化测试 ...

  6. python基础学习笔记二之列表

    1.列表 ①列表的创建: ②列表的查询(索引): ③列表的切片操作: 此处要注意到:返回索引0到3的元素,顾头不顾尾. ④列表的增加: s.append()  #直接在结尾追加 s.insert()  ...

  7. Algorithm --> 判读是否是子树

    问题 判断一棵树是否是另一棵树的子树,如图 思路 问题分两步: 找值相同的根结点(遍历解决) 判断两结点是否包含(递归:值.左孩子.右孩子分别相同) 树节点定义 struct TreeNode { i ...

  8. iOS 跑马灯带图片可点击

    项目中有个需求,需要以跑马灯的形势滚动展示用户的实时数据,跑马灯需要有用户头像,内容的长度不固定,并且可以点击,滚动效果还要足够流畅,本着不重复造轮子的心理,在网上各种搜索,发现都没法找到满足需求的d ...

  9. Android权限Uri.parse的几种用法(转载)

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  10. S2第一本书内测

    <深入.NET平台和C#编程>内部测试题-笔试试卷 一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格 ...