Vue 中使用 axios

2023年 1月 4日 47.5k 0

1. axios 安装

使用 npm 安装

1
npm install axios --save

全局注册有两种方法:

  • 绑定到原型上
  • 1
    2
    
    import axios from 'axios'
    Vue.prototype.axios = axios
    

    这种方法,每个 Vue 对象都会新增一个 axios 对象。

    1
    2
    3
    
    this.axios.post(apiUrl).then((res) => {
        //do something
    })
    
  • 挂载到 windows 对象上
  • 在 DOM 的任意地方,都能使用 axios 函数。

    1
    2
    
    import axios from 'axios'
    window.axios = axios;
    
    1
    2
    3
    
    axios.post(apiUrl).then((res) => {
        //do something
    })
    

    2. axios 配置

    为了配合 Django 的 CSRF 校验,需要在 axios 中进行配置。

    1
    2
    3
    4
    
    var axiosDefaults = require("axios/lib/defaults");
    axiosDefaults.xsrfCookieName = "csrftoken";
    axiosDefaults.xsrfHeaderName = "X-CSRFToken";
    axiosDefaults.withCredentials = true;
    

    3. axios 拦截器

    拦截器可以对请求做一些公共的处理,比如异常、返回数据的格式。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    axios.interceptors.response.use(
        response => {
            return response;
        },
        error => {
            if (error.response) {
                switch (error.response.status) {
                    case 500:
    				// do something
                        break;
                    case 402:
    				// do something
                        break;
                }
            }
            return Promise.reject(error.response.data);   // 返回接口返回的错误信息
        });
    

    4. axios 传参

    4.1 get 请求

    1
    2
    3
    4
    5
    6
    
    let params = {
        key1: 'value1',
        key2: 'value2'
    }
    axios.get(apiUrl, { params })
    //数据编码形式: /?key1=value1&key2=value2
    

    4.2 POST 请求 x-www-form-urlencoded

    axios 默认将 javascript 对象序列化为 JSON 。以 application/x-www-form-urlencoded 格式发送数据。

    1
    2
    3
    4
    5
    
    let params = new URLSearchParams()
    params.append('key1', 'value1')
    params.append('key2', 'value2')
    axios.post(apiUrl, params)
    //数据编码形式:key1=value1&key2=value2
    
    1
    2
    3
    4
    5
    6
    7
    
    let qs = require('qs')
    let params = {
        key1: 'value1',
        key2: 'value2'
    }
    axios.post(apiUrl, qs.stringify(params));
    //数据编码形式:key1=value1&key2=value2
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    import qs from 'qs';
    let data = {
        key1: 'value1',
        key2: 'value2'
    }
    let options = {
        method: 'POST',
        headers: { 'content-type': 'application/x-www-form-urlencoded' },
        data: qs.stringify(data),
        url: apiUrl
    };
    axios(options);
    // 数据编码形式: key1=value1&key2=value2
    

    4.3 Form data

    1
    2
    3
    4
    5
    6
    7
    8
    
    axios.post(apiUrl, {
            key1: 'value1',
            key2: 'value2'
        }, {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
        })
    

    4.4 request payload

    1
    2
    3
    4
    
    let formData = new FormData()
    formData.append('key1', 'value1')
    formData.append('key2', 'value2')
    axios.post(apiUrl, formData)
    

    5. Django 后台不能区分 ajax 和非 ajax

    查看源码 django/http/request.py 文件可以看到,Django 是通过请求头部的标识来区分是否为 Ajax 请求。

    1
    2
    
    def is_ajax(self):
    	return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
    

    axios 处理办法

    1
    2
    3
    
    axiosDefaults.headers.common = {
        'X-Requested-With': 'XMLHttpRequest'
    }
    

    6. 参考

    • https://github.com/axios/axios/blob/master/README.md#using-applicationx-www-form-urlencoded-format

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论