使用Angular2的Http发送AJAX请求

Angular的文档并不详细,甚至API文档也有一些错误。经过查阅资料并经大量实验,终于明确了Angular的Http发送Ajax请求的方式方法。本文描述了通过Angular的Http发送Ajax请求相关的全部内容。

1. Angular的Http类

Angular的Http类负责与服务端通讯,通过Ajax的形式访问远程服务器。

Angular的Http访问远程服务器,可以使用GET、POST、PUT、DELETE、OPTIONS等方法(method)。

当然,我们最常使用的是GET和POST方法。

当Angular发现你所访问的地址是跨域的,会自动发送一次OPTIONS方法的请求,确定此跨域服务器是否支持跨域访问。若不支持跨域访问,则给出错误,不能执行真正的GET、POST请求。

2. 使用Angular发送GET请求

// 以下是一些必须的导入
import { Http, URLSearchParams,RequestOptions } from '@angular/http'; // 发送请求有关的类
import { Observable } from "rxjs"; // 明确请求后的可观察对象是Rx的可观察对象,如未指明是Rx的可观察对象,会报错。
import 'rxjs/add/operator/toPromise'; // 引入toPromise操作符,否则会报错,toPromise方法未定义。
// 发送get请求的方法
get() : Promise<string> {
let serverurl: string = "url地址";
// 创建请求参数对象,所有请求参数被放在此对象中。
let param = new URLSearchParams();
param.append("param1","test"); // 向请求参数中放入参数及值
// 创建请求设置对象,将请求参数作为其构造方法参数对象的"search"属性值。
// 请注意,在这里我们并未明确请求头(Headers),Angular会根据请求方法(method)
// 及请求参数的类型,自动确定请求头类型。
let options = new RequestOptions({search:param});
// 发起get请求。注意http属性必须由依赖注入而来。
return this.http.get(serverurl, options)
.toPromise() // 将可观察对象转为承诺,接下来按照承诺的方式处理。
.then(response => {
let data = response.json();
if (data.is_ok == 2) {
let result:string = data.rs;
console.log(result);
return Promise.resolve(result);
}
return Promise.reject("false");
}).catch(error => {
console.log(error);
return Promise.reject("false");
});
}

3. 使用Angular发送POST请求

// 以下是一些必须的导入
import { Http, URLSearchParams,RequestOptions } from '@angular/http'; // 发送请求有关的类
import { Observable } from "rxjs"; // 明确请求后的可观察对象是Rx的可观察对象,如未指明是Rx的可观察对象,会报错。
import 'rxjs/add/operator/toPromise'; // 引入toPromise操作符,否则会报错,toPromise方法未定义。
// 发送Post请求的方法
postByForm(): Promise<string> {
let serverurl: string = "url地址";
// 创建请求参数对象,所有请求参数被放在此对象中。
let param = new URLSearchParams();
param.append("param1","test"); // 向请求参数中放入参数及值
// 发起Post请求(http属性必须由依赖注入而来),请注意,post方法比get方法多了一个参数,多的是第2个参数。
// 第1个参数是url地址,第2个参数是请求参数;
// 第3个参数对应get方法的第2个参数,是请求设置(RequestOptions)对象。
// 在get请求中,我们将请求参数(URLSearchParams)放在了请求设置的(RequestOptions)对象的"search"属性中,
// 在post方法中,post请求参数作为post方法的第2个参数,不能放到请求设置的(RequestOptions)对象的"search"属性中。
// 如放到了请求设置的(RequestOptions)对象的"search"属性中,则被作为请求get参数的一部分。
// 如:url地址?param1=test,
// 这不是我们想要的。我们使用了post方法,即是希望在请求体的form-data部分传输我们的参数,
// 而不希望请求参数出现在url地址上。
// 在这里,请求设置对象是个null,因为我们不需要给本次请求设置请求头,请求头由anglar自动计算。
return this.http.post(serverurl, param, null)
.toPromise()
.then(response => {
let data = response.json();
if (data.is_ok == 2) {
let result:string = data.rs;
console.log(result);
return Promise.resolve(result);
}
return Promise.reject("false");
}).catch(error => {
console.log(error);
return Promise.reject("false");
});
}

4. 使用Angular以FormData对象作为参数发送POST请求

FormData是 XMLHttpRequest Level 2 新增的一个对象,在IE10及以上版本受支持,其他浏览器的新版本基本都支持。

FormData的结构就是一组键值对,键名是参数名,键值是参数值。它最大的特点是支持二进制流,所以我们使用FormData主要是用AJAX技术上传文件。上传文件时,文件是FormData中的一组键值对,除了文件以外的参数,也可以被放到FormData中一并提交给服务器。

// 以下是一些必须的导入
import { Http, URLSearchParams,RequestOptions } from '@angular/http'; // 发送请求有关的类
import { Observable } from "rxjs"; // 明确请求后的可观察对象是Rx的可观察对象,如未指明是Rx的可观察对象,会报错。
import 'rxjs/add/operator/toPromise'; // 引入toPromise操作符,否则会报错,toPromise方法未定义。
// 发送Post请求的方法
postByFormData(): Promise<string> {
let serverurl: string = "url地址";
let param = new FormData();
// 放入要上传的文件
let file = this.fileElement.nativeElement.files[0];
param.append("file",file);
// 放入其他参数
param.append("param1","test");
// 发送post请求(http属性必须由依赖注入而来),可以看到,除了第二个参数param的类型为FormData外,其余参数与普通post请求一致。
// angular会自动计算请求头类型。
return this.http.post(serverurl, param, null)
.toPromise()
.then(response => {
let data = response.json();
if (data.is_ok == 2) {
let result:string = data.rs;
console.log(result);
return Promise.resolve(result);
}
return Promise.reject("false");
}).catch(error => {
console.log(error);
return Promise.reject("false");
});
}

版权声明:本博文参考自 - https://blog.csdn.net/xin_bao_long/article/details/82798328

使用Angular2的Http发送AJAX请求的更多相关文章

  1. 在发送ajax请求时加时间戳或者随机数去除js缓存

    在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...

  2. 原生js发送ajax请求

    堕落了一阵子了,今天打开博客,发现连登录的用户名和密码都不记得了.2016年已过半,不能再这么晃荡下去了. 参加了网易微专业-前端攻城狮 培训,目前进行到大作业开发阶段,感觉举步维艰.但是无论如何,不 ...

  3. jQuery发送ajax请求

    利用jquery发送ajax请求的几个模板代码. $.ajax({ async : false, type: 'POST', dataType : "json", url: &qu ...

  4. JQuery发送ajax请求不能用数组作为参数

    JQuery发送ajax请求不能用数组作为参数,否则会接收不到参数, 一.js代码如下: $('#delete-button').click(function(){        var select ...

  5. js中使用队列发送ajax请求

    最近,项目中需要按照先后顺序发送ajax请求,并且在一次请求结束后才能发起下一次,不然就会导致逻辑错误. 解决办法是定义一个数组,保存ajax请求数据. 以下使用extjs4定义一个类 Ext.def ...

  6. IE6下a标签上发送ajax请求总是error

    IE6下真是处处是坑啊!!!走过了一个又一个坑,记录一下吧. 之前不知道a标签上注册click事件之后,发送ajax请求总是error.后来经过几番网上搜索,终于找到高人遇到此坑的解决办法.原来是a标 ...

  7. Jquery发送ajax请求以及datatype参数为text/JSON方式

    Jquery发送ajax请求以及datatype参数为text/JSON方式 1.方式一:datatype:'text' 2.方式二:datatype:'JSON' 3.使用gson-1.5.jar包 ...

  8. 【liferay】1、使用alloy-UI发送ajax请求

    1.首先liferay要发送ajax请求,那么就需要在jsp中定义resourceURL <portlet:resourceURL var="workDeal" id=&qu ...

  9. Axios发送AJAX请求

    目录 Axios 特征 axios提供主要三种发起请求的方式 方式一:直接axios实例直接call方式 方式二:通过axios实例提供的不同http请求方式的方法 方式三:其实是从第二种方式中单独提 ...

随机推荐

  1. gitlab-ci + k8s 之docker (三)

    docker 在本系列(一)中(https://www.cnblogs.com/huandada/p/9965771.html)的runner_tomcat.sh脚本有涉及到镜像的推送,本文主要记录整 ...

  2. 3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

    在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slic ...

  3. js中级小知识3

    函数: 函数在调用的时候,会形成一个私有作用域,内部的变量不会被外面访问,这种保护机制叫闭包.这就意味着函数调用完毕,这个函数形成的栈内存会被销毁. 有些时候我们不希望他被销毁. 函数归属谁跟它在哪调 ...

  4. ERROR org.hibernate.hql.internal.ast.ErrorCounter unexpected token: form 异常解决

    ERROR org.hibernate.hql.internal.ast.ErrorCounter unexpected token: form 异常解决 根据异常提示:我找了我的MySQL语句:果然 ...

  5. 利用excel模板,将数据填充到excel中

    package com.excel;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExce ...

  6. AttributeError: 'int' object has no attribute 'isdigit'(python下的isdigit函数)

    python下的isdigit函数:  isdigit() 方法检测字符串是否只由数字组成. 语法 isdigit()方法语法:  str.isdigit() 示例代码如下: 结果: 我想说的重点在于 ...

  7. Gym 101775C - Traffic Light - [思维题]

    题目链接:http://codeforces.com/gym/101775/problem/C 题意: 给出 $N$ 个红绿灯,又给出 $N+1$ 个距离 $S_i = S_0,S_1, \cdots ...

  8. [yum] yum加速

    通常,以我对于个人生活和工作品质的要求,并没有这个需求. 因为我的宽带费很贵,独享.就算是centos主站,也很快.但是当你去了一些办公环境恶劣的地方上班的时候, 也难免动用一些小技巧.如下: 装这个 ...

  9. python 发送带附件的邮件

    特别注意的地方:filespart.add_header("Content-Disposition","attachment",filename=file_na ...

  10. IDEA为了使用方便,需要改的几条配置

    自动编译开关 在Eclipse中自动编译开关是开着的,如下所示那么,在IDEA中,务必要手动将其打开,非常重要! 忽略大小写开关 IDEA默认是匹配大小写,此开关如果未关.你输入字符一定要符合大小写. ...