AXIOS的基础应用

axios是基于Promise封装的一款AJAX库 (核心是:XMLHttpRequest)
链接: link.

基于axios发送AJAX请求,返回的结果都是一个Promise实例
=>AJAX请求成功(网络层成功:状态码以2开头)
=>对应的Promise实例也是成功

Qs 中有三个方法 formats parse stringify

Qs.stringify({name:"xiaoyu",age:22},{arrayFormat: 'brackets'})
输出结果在下
"name=xiaoyu&age=22"

Qs.parse("name=xiaoyu&age=22")
输出结果在下
{name: "xiaoyu", age: "22"}
一些基本的配置信息
axios({
    // 发送给服务器的地址一般都是: baseURL + url
    url: "/user/list",
    baseURL: "http://127.0.0.1:8080",
    method: "post",
    // 设置自定义请求头信息
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    // GET请求的传参信息(默认按照问号传参传递给服务器)
    params: {
        search: ""
    },
    // POST请求基于请求主体传递给服务器的内容(AXIOS默认是把对象变为JSON字符串,按照application/json格式传递给服务器的)
    data: {
        lx: 1,
        name: "清欢"
    },
    transformRequest: function (data) {
        // 只针对于POST请求,在这里可以在发送给服务器数据之前,把请求主体中的信息进行格式化处理(处理为我们想要的格式)
        return Qs.stringify(data)
    },
    // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
    timeout: 0,
    // `withCredentials` 表示跨域请求时是否需要使用凭证
    withCredentials: false,
    // 预设服务器返回数据类型的格式,不能干预服务器返回的数据格式,只会把服务器返回的格式按照我们的配置转换为对应的数据格式
    responseType: "json",
    // 自定义AJAX请求成功和失败的请求标准
    validateStatus(status) {
        return status >= 200 && status < 300
    }
})
// 也可以设置一些公共的配置信息 便于每一个请求使用
axios.defaults.baseURL = "http://127.0.0.1:8080"
axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded"
axios.defaults.transformRequest = data => Qs.stringify(data)
axios.defaults.timeout = 0
axios.defaults.withCredentials = true
axios({
    url: "/user/list",
    method: "get",
    params: {
        departmentId: 0,
        search: ''
    },
    headers: {
        account: "lalalala"
    }
})

axios({
    url: "/user/login",
    method: "post",
    data: {
        account: "小雨",
        password: ""
    }
})

上面的方式如果写多个会很复杂 我们按照下面的方式来写
axios.get(url,[config])
axios.post(url,data,[config])
// config 是配置项

axios.get("/user/list", {
    params: {
        departmentId: 0,
        search: ''
    }
}).then(response => {
    console.log(response);
 
    // response会包含以下所有的属性
    /!*
        status:状态码
        statusText:状态码的详细信息
        request:XHR实例对象
        config:自己传递的配置项信息
        headers:存储响应头信息
        data:相应主体信息(默认已经转换为JSON格式的对象了)
 
        这个原生的方法可以获取所有的请求头信息 getAllResponseHeaders()
    *!/
    console.log(response.request.getAllResponseHeaders());
 
    // 我们一般只要data中的信息,所以只返回data即可
    return response.data
}).then(result => {
    console.log(result);
})

axios.post("/user/login", {
    account: "xiaoyu",
    password: ""
})
// 响应拦截器,从服务器获取结果 ~ 自己.then中间做的事情
// 设置了响应拦截器就可以省略中间的这一步then 响应拦截器主要对 失败时做了详细的处理
axios.interceptors.response.use(response => {
    // 从服务器获取到了数据,我们只把响应主体信息传递给下一个then即可
    return response.data
}, reason => {
    // 从服务器没有获取到数据(网络层失败)
    let response = null
    if (reason) {
        // 有reason 说明服务器有响应,状态码是4/5开头的 然后再判断它的状态码
        let response = reason.response
        switch (response.status) {
            case 401:
                // 一般情况下是未登录(未授权)
                break;
            case 403:
                // 一般情况下是token过期
                break;
            case 404:
                // 地址不存在
                break
        }
    } else {
        if (!window.navigator.onLine) {
            // window.navigator.onLine = true 代表有网
            alert("网络断开,请稍后重试")
        }
    }
    
    // 失败时一定要写下面这一步 若是不写一样会走下面的then方法
    return Promise.reject(response)
})

axios.get("/user/list", {
    params: {
        departmentId: 0,
        search: ''
    }
})
// 响应拦截器走完才会走下面这个then
.then(result => {
    console.log(result);
})

// 请求拦截器:我们发送请求 ~ 服务器接受到内容 之间处理的事情(不论 get 和 post)
axios.interceptors.request.use(config => {
    // 真实项目中,我们一般会在登录成功以后,把从服务器获取到的token信息存储到本地,以后再发送请求时,一般都把token带上(自定义请求头)
    let token = localStorage.getItem("token")
    if(token){
        config.headers['Authorization'] = token
    }
    // 上面的if判断也可写成下面的这种方式
	// token && (config.headers["Authorization"] = token)
    return config
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值