vue之axios

什么是 axios?

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

特性

1 从浏览器中创建 XMLHttpRequests
2 从 node.js 创建 http 请求
3 支持 Promise API
4 拦截请求和响应
5 转换请求数据和响应数据
6 取消请求
7 自动转换 JSON 数据
8 客户端支持防御 XSRF

安装

npm install axios

使用

GET请求

// 为给定 ID 的 user 创建请求
axios.get(/user?ID=12345)
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// 上面的请求也可以这样做
axios.get(/user, {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

POST请求

axios.post(/user, {
    firstName: Fred,
    lastName: Flintstone
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

并发

function getUserAccount() {
  return axios.get(/user/12345);
}

function getUserPermissions() {
  return axios.get(/user/12345/permissions);
}

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // 两个请求现在都执行完成
  }));

axios API

// 发送 POST 请求
axios({
  method: post,
  url: /user/12345,
  data: {
    firstName: Fred,
    lastName: Flintstone
  }
});
// 获取远端图片
axios({
  method:get,
  url:http://bit.ly/2mTM3nY,
  responseType:stream
})
  .then(function(response) {
  response.data.pipe(fs.createWriteStream(ada_lovelace.jpg))
});
// 发送 GET 请求(默认的方法)
axios(/user/12345);

创建实例

const instance = axios.create({
  baseURL: https://some-domain.com/api/,
  timeout: 1000,
  headers: {X-Custom-Header: foobar}
});
import axios from axios
import { getToken } from @/utils/auth

// axios.defaults.headers.common[‘Authorization‘] = getToken();  //设置headers
// axios.defaults.headers.post[‘Content-Type‘] = ‘application/x-www-form-urlencoded‘;


// 创建axios实例
const service = axios.create({
  baseURL: ‘http://127.0.0.1:8000‘, // api的base_url
  timeout: 15000, // 请求超时时间
  // headers: {  // 设置headers
  //   // ‘X-Custom-Header‘: ‘foobar‘,
  //   ‘Authorization‘: getToken(),
  //   ‘Content-Type‘: ‘application/x-www-from-urlencoded‘
  // }
})

// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {

    config.headers= {
      Authorization: getToken(),
      Content-Type: application/x-www-from-urlencoded‘  // 跨域设置headers
    }
    // config.headers[‘Authorization‘] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    // config.headers[‘Authorization‘] = AUTH_TOKEN, // 让每个请求携带自定义token 请根据实际情况自行修改
    // config.headers[‘Content-Type‘] = ‘application/x-www-from-urlencoded‘
  }
  return config
}, error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

// respone拦截器
service.interceptors.response.use(
  response => {
  /**
  * code为非200是抛错 可结合自己业务进行修改
  */
    const res = response.data

    if (res.code !== 200) {
      Message({
        message: res.message,
        type: error,
        duration: 3 * 1000
      })

      // 401:未登录;
      if (res.code === 401) {
        MessageBox.confirm(你已被登出,可以取消继续留在该页面,或者重新登录, 确定登出, {
          confirmButtonText: 重新登录,
          cancelButtonText: 取消,
          type: warning
        }).then(() => {
          store.dispatch(FedLogOut).then(() => {
            location.reload()// 为了重新实例化vue-router对象 避免bug
          })
        })
      }
      return Promise.reject(error)
    } else {
      console.log(response.data,"return")
      return response.data
    }
  },
  error => {
    console.log(err + error)// for debug
    Message({
      message: error.message,
      type: error,
      duration: 3 * 1000
    })
    return Promise.reject(error)
    // return response.data
  }
)

export default service

全局的 axios 默认值

axios.defaults.baseURL = https://api.example.com;
axios.defaults.headers.common[Authorization] = AUTH_TOKEN;
axios.defaults.headers.post[Content-Type] = application/x-www-form-urlencoded;

自定义实例默认值

// Set config defaults when creating the instance
const instance = axios.create({
  baseURL: https://api.example.com
});

// Alter defaults after instance has been created
instance.defaults.headers.common[Authorization] = AUTH_TOKEN;

配置的优先顺序

配置会以一个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后者将优先于前者。这里是一个例子:

// 使用由库提供的配置的默认值来创建实例
// 此时超时配置的默认值是 `0`
var instance = axios.create();

// 覆写库的超时默认值
// 现在,在超时前,所有请求都会等待 2.5 秒
instance.defaults.timeout = 2500;

// 为已知需要花费很长时间的请求覆写超时设置
instance.get(/longRequest, {
  timeout: 5000
});

拦截器

在请求或响应被 then 或 catch 处理前拦截它们。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

如果你想在稍后移除拦截器,可以这样:

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
可以为自定义 axios 实例添加拦截器
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

错误处理

axios.get(/user/12345)
  .catch(function (error) {
    if (error.response) {
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // The request was made but no response was received
      // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
      // http.ClientRequest in node.js
      console.log(error.request);
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log(Error, error.message);
    }
    console.log(error.config);
  });

也可以使用 validateStatus 配置选项定义一个自定义 HTTP 状态码的错误范围。

axios.get(/user/12345, {
  validateStatus: function (status) {
    return status < 500; // Reject only if the status code is greater than or equal to 500
  }
})

使用 application/x-www-form-urlencoded format

默认情况下,axios将JavaScript对象序列化为JSON。 要以application / x-www-form-urlencoded格式发送数据,您可以使用以下选项之一。

在浏览器中,您可以使用URLSearchParams API,如下所示:

onst params = new URLSearchParams();
params.append(param1, value1);
params.append(param2, value2);
axios.post(/foo, params);

使用qs库编码数据:

const qs = require(qs);
axios.post(/foo, qs.stringify({ bar: 123 }));

本文来自axios中文文档|axios中文网

vue之axios

上一篇:不下载软件如何将手机图片免费识别成文字?


下一篇:Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.lxh.mapper3.clazzMapper.selCla