# Ajax

在js中,和服务器通信主要通过XMLHttpRequest(XHR)实现。

# 常用的方法和属性

let xhr = new XMLHttpRequest();

/**
 * 初始化请求 open(method, url, async, user, password)
 * method: 请求类型
 * url: 请求地址
 * async: 可选,是否是异步请求,默认为true
 * user: 可选,用户名认证
 * password: 认证密码
 */
xhr.open('GET', '/api/demo');

//设置为同步还是异步

//设置请求最大时长,单位毫秒
xhr.timeout = 5000;

//设置header,必须在open和send之间调用
xhr.setdRequestHeader('user', 'user_id');
xhr.setdRequestHeader('access_token', 'token');

/**
 * 设置响应的数据格式 
 * 默认值: '', 效果和text一样
 * 可选值: text, json, arraybuffer(二进制数据js对象ArrayBuffer), blob(二进制数据的Blob对象), document,
 */ 
xhr.responseType = 'json';

/**
 * send(options) 发送请求,接受一个可选参数
 * options可选参数类型
 *      String: 可以把对象数组,转化成json后,再传入send
 *      FormData: 表单对象
 *      ArrayBuffer: 二进制数据js对象ArrayBuffer
 *      blob: 二进制数据的Blob对象
 */
let form = new FormData();

/**
 * 给form添加参数 
 * form.append(name, value, fileName);
 * name: 键的名称,对应input的name值
 * value: 键对应的值
 * fileName: 如果value是file类型的话,可传入file的name
 */
form.append('name', 'uncle-yang');
form.append('age', 23);
form.append('avatar', file, '帅帅的大叔.jpg');

// 发送
xhr.send(form);

//中止请求
xhr.abort();

//请求发送后:

// 当请求状态改变时执行
xhr.onreadyStatechange = function(){
    /**
     * 请求代理所处的状态 
     * 返回值:
     *      0: 代理被创建,但是还未调用open()方法
     *      1: open()方法已经调用
     *      2: send()方法已经调用
     *      3: 下载中,responseText已经包含部分数据
     */
    var readyState = xhr.readyState;
    var status = xhr.status;//http请求的状态码

    //如果HTTP 响应已经完全接收。并且 由服务器返回的 HTTP 状态代码,如 200 表示成功
    if(readyState == 4){
        var responseType = xhr.response; // 请求数据的类型
        var response = xhr.responseText;//目前为止为服务器接收到的响应体

        if(status == 200){
            //上传成功
            console.log('success', response);
        }else{
            console.log('error', response);
        }
    }
}

/**
 * 如果是上传文件,可以用uplod属性
 * funName可选值
 *      onloadstart: 开始获取
 *      onprogress: 数据传输进行中
 *      onabort: 获取操作中止
 *      onerror: 获取失败
 *      onload: 获取成功
 *      ontimeout: 超时
 *      onloadend: 获取完成,无论成功与否
 */
xhr.upload['onprogress'] = function(ev){
    var percent = 0; 

    if(ev.lengthComputable) { 
        percent = 100 * ev.loaded/ev.total; 

        console.log("上传进度: ", percent + '%');
    }
}

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
上次更新: 1/10/2020, 2:20:13 PM