数据请求相关

ajax

function ajaxFn() {
    // IE5,6用 new ActiveXObject('Microsoft.XMLHTTP');
    var xhr=new XMLHttpRequest();
    /* 所有的浏览器都支持该事件 */
    xhr.onreadystatechange=function(){//这个事件函数放在哪里都可
        if(xhr.readyState===4){//针对open方法可以调用并且接受了全部响应数据
            if(xhr.status===200){//响应的http状态
                console.log(xhr.responseText);
            }
        }
    };
    /* 可以用onload替代上面的onreadystatechange */
    xhr.onload=function(){
        // 处理取回的数据(在 xhr 中找到)  可以打印 xhr  看看有哪些值
    }
    xhr.timeout = 2000; // 超时时间,单位是毫秒(设置的超时值,在请求头中不显示)
    
    /* @des get方式 */
    /* HTTP 协议 不要求也不禁止 GET 请求带 body。
     大多数支持 但是浏览器会抛错 
    */
    xhr.open('get','https://aa.cc.com/api',true); // true表示异步,当设置为同步时,一旦发出,后续的所有代码不再执行,等待接口返回
    xhr.send(null);//将请求发送到服务器

    if ('如果不需要这次请求的值了') {
        xhr.abort();
    }

    /* @des post方式 */
    xhr.open('post', '.com/api',true);
    xhr.setRequestHeader('Content-type','application/json'); 
    xhr.setRequestHeader('Auther','hewitt'); 
    xhr.send(JSON.stringify(data));

    /* @des 设置返回值的格式 */
    // xhr.responseType = 'json';
} 

传递 formData 数据

const ajaxFn = () => {
    var xhr=new XMLHttpRequest();
    xhr.onload=function(){
        // 处理取回的数据(在 xhr.response 中找到)
    }
    xhr.timeout = 10000;
    xhr.responseType = 'json';
    xhr.open('post', 'xxxxx.com', true);
    // xhr.setRequestHeader('Content-type','multipart/form-data'); // 这里不要设置 content-type 由浏览器自动匹配  
    const form = new FormData()
    form.append('username', 'xx')
    form.append('password', 123)
    xhr.send(form);
}

status 200表示成功,304表示 资源没有修改可以直接使用浏览器缓存

必须在调用open()方法之后且调用send()方法之前调用setRequestHeader()

用原生 ajax 提交 FormData 采用 post 不用加 contentType 浏览器会自动添加,主要是为了自动设置 boundary(用于分割上传的数据字段,就是类似于分隔符)

fetch

是一个现代的概念,等同于 XMLHttpRequest 核心在于对 HTTP 接口的抽象,包括 Request、Response、Headers 和 Body

fetch('http://localhost:1025/121', {
        /* @des 凭证 */
        credentials:'include',
        headers: { 'Content-Type': 'image/jpeg|application/json' }, 
        method: 'get',
        mode: "cors",
    }).then(function (response) {
        /* @des 必须先返回一个数据格式*/
        // response.formData() || response.json()
        return response.text();
    }).then(function (data) {
        console.log(data);
    })

// 包含cookie:"omit"(默认),"same-origin"以及"include"
// 默认情况下 fetch不会接受或者发送cookies

将对象转换为query String所需格式

function objectToQueryString(obj) {
    const arr = [];
    Object.keys(obj).forEach(key => {
        if(obj[key]) arr.push(`${key}=${obj[key]}`)
    })
    return arr.join('&')
}

queryString 转换为对象 { a: 1, b: 2 }

/**
 * @des 获取 queryString 转换为对象 { a: 1, b: 2 }
 */
export function queryStringToObj (str) {
    str = str || 'xxxx/xx?a=1&b=2'

    const regExp = /(?:\?|&)([^&]*)/g
    let result = ''
    const obj = {}

    while ((result = regExp.exec(str)) !== null) {
        const kv = result[1].split('=')
        obj[kv[0]] = kv[1]
    }

    return obj
}
Last Updated:
Contributors: Warren