专栏首页Devops专栏49. Vue使用axios发送Ajax请求

49. Vue使用axios发送Ajax请求

需求

Vue.js的框架中,如果要发送ajax请求是需要借助外部库的。在vue1.0版本官方推荐的vue-resourcevue2.0版本官方推荐的axios,或者也可以使用jquery来发送ajax请求。

那么本篇章主要来介绍使用axios库来发送ajax请求。

axios介绍

Github仓库: https://github.com/axios/axios

中文文档: http://www.axios-js.com/zh-cn/docs/

什么是 axios

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

安装axios

Using npm:

$ npm install axios

Using bower:

$ bower install axios

Using yarn:

$ yarn add axios

Using jsDelivr CDN:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

Using unpkg CDN:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

可以从上面看到,安装axios可以使用以上的5种方式。那么下面我将使用CDN的js引入方式,来写一个示例代码。

基本使用示例

1.说明

测试验证发送ajax请求,首先需要一个接收ajax的后台服务,在这里我写了一个flask的后台服务。

在前端我则使用js的引入方式编写axios示例,发送get以及post请求。

那么其中post请求主要常用有两种,如下:

  • 一种是form请求格式
  • 一种是json格式

2.flask的后台服务代码

from flask import Flask, jsonify, request, make_response
import json

# 实例化app
app = Flask(import_name=__name__)

# 定义全局列表数据变量
data_list = [
    {'id': 1, 'Name': '奔驰', 'Ctime': '2020-01-21 21:25:44'},
    {'id': 2, 'Name': '宝马', 'Ctime': '2020-01-20 21:25:44'},
    {'id': 3, 'Name': '法拉利', 'Ctime': '2020-01-19 11:25:44'},
    {'id': 4, 'Name': '丰田', 'Ctime': '2020-01-18 13:25:44'},
    {'id': 5, 'Name': '特斯拉', 'Ctime': '2020-01-17 15:25:44'},
]


# 删除列表数据
@app.route('/del_list', methods=["POST"])
def del_list():
    # 设置返回数据
    data = {
        'status': 0,  # 0请求成功 1请求失败
        'messages': "删除成功",
    }

    res = make_response(jsonify(data))  # 设置响应体
    res.status = '200'  # 设置状态码
    res.headers['Access-Control-Allow-Origin'] = "*"  # 设置允许跨域
    res.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'

    # 接收post请求的form参数
    id = request.form.get('id')
    print('id = %s' % (id))

    # 请求数据异常,则返回失败
    if id is None:
        data = {
            'status': 1,  # 0请求成功 1请求失败
            'messages': "删除失败",
        }
        res = make_response(jsonify(data))  # 设置响应体
        res.status = '401'  # 设置状态码
        return res

    # 将根据id删除列表list中的数据
    for i in range(0, len(data_list) - 1):
        item = data_list[i]

        if item['id'] == int(id):
            data_list.pop(i)  # 删除数据

    # 返回json数据
    return res


# 添加列表数据 json格式
@app.route('/add_list_json', methods=["POST"])
def add_list_json():
    # 设置返回数据
    data = {
        'status': 0,  # 0请求成功 1请求失败
        'messages': "添加成功",
        'data': "json"
    }

    res = make_response(jsonify(data))  # 设置响应体
    res.status = '200'  # 设置状态码
    res.headers['Access-Control-Allow-Origin'] = "*"  # 设置允许跨域
    res.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'

    # 接收处理json数据请求
    data = json.loads(request.data)  # 将json字符串转为dict
    id = data['id']
    name = data['name']
    print('id = %s, name = %s' % (id, name))

    # 请求数据异常,则返回失败
    if name is None:
        data = {
            'status': 1,  # 0请求成功 1请求失败
            'messages': "添加失败",
        }
        res = make_response(jsonify(data))  # 设置响应体
        return res

    # 将数据加入到列表list中
    data_list.append({'id': id, 'Name': name, 'Ctime': '2020-01-17 15:25:44'})

    # 返回json数据
    return res


# 添加列表数据 form表单
@app.route('/add_list_form', methods=["POST"])
def add_list_form():
    # 设置返回数据
    data = {
        'status': 0,  # 0请求成功 1请求失败
        'messages': "添加成功",
        'data': "form"
    }

    res = make_response(jsonify(data))  # 设置响应体
    res.status = '200'  # 设置状态码
    res.headers['Access-Control-Allow-Origin'] = "*"  # 设置允许跨域
    res.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'

    # 接收post请求的form参数
    id = request.form.get('id')
    name = request.form.get('name')
    print('id = %s, name = %s' % (id, name))

    # 请求数据异常,则返回失败
    if name is None:
        data = {
            'status': 1,  # 0请求成功 1请求失败
            'messages': "添加失败",
        }
        res = make_response(jsonify(data))  # 设置响应体
        return res

    # 将数据加入到列表list中
    data_list.append({'id': id, 'Name': name, 'Ctime': '2020-01-17 15:25:44'})

    # 返回json数据
    return res


# 获取列表数据
@app.route('/get_list', methods=["GET"])
def get_list():
    data = {
        'status': 0,  # 0请求成功 1请求失败
        'messages': data_list,
    }

    res = make_response(jsonify(data))  # 设置响应体
    res.status = '200'  # 设置状态码
    res.headers['Access-Control-Allow-Origin'] = "*"  # 设置允许跨域
    res.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE'
    return res


if __name__ == '__main__':
    app.run(debug=True)

该后台服务我提供了4个请求:查询列表数据、添加列表数据(json/form)、删除列表数据。使用postman分别测试如下:

  • 查询列表数据

image-20200225144337145

  • 添加列表数据form

image-20200225163953591

  • 添加列表的数据json

image-20200225164032846

  • 删除列表数据

image-20200225144503508

好了,经过测试,后台的4个api接口都可以用了。那么下面来看看如何使用axios发出请求。

3.在前端使用axios发送请求

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!--  1.导入vue.js库  -->
        <script src="lib/vue.js"></script>
        <!-- 2.导入axios库 -->
        <script src="lib/axios/axios.min.js"></script>

    </head>
    <body>

        <div id="app">
            <input type="button" value="get请求" @click="getInfo">
            <input type="button" value="post请求form" @click="postInfoForm">
            <input type="button" value="post请求json" @click="postInfoJson">
        </div>

        <script>
            // 2. 创建一个Vue的实例
            var vm = new Vue({
                el: '#app',
                data: {
                    show() {
                        console.log('调用show方法');
                    },
                },
                methods: {
                    getInfo() { // 发起get请求

                        axios.get('http://127.0.0.1:5000/get_list')
                            .then(function(response) {
                                console.log(response);
                            })
                            .catch(function(error) {
                                console.log(error);
                            });

                    },
                    postInfoForm() { // 发起 post 请求   application/x-wwww-form-urlencoded

                        // 发送 POST 请求
                        axios({
                                method: 'post',
                                url: 'http://127.0.0.1:5000/add_list_form',
                                data: {
                                    id: '6',
                                    name: '福特'
                                },
                                // 设置 transformRequest 和 headers 是兼容发送form表单格式的请求
                                transformRequest: [function(data) {
                                    // Do whatever you want to transform the data
                                    let ret = '';
                                    for (let it in data) {
                                        ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
                                    }
                                    return ret
                                }],
                                headers: {
                                    'Content-Type': 'application/x-www-form-urlencoded',
                                }
                            })
                            .then(function(response) {
                                console.log(response);
                            })
                            .catch(function(error) {
                                console.log(error);
                            });
                    },
                    postInfoJson() { // 发起 post 请求   json

                        var data = {
                            "id": '7',
                            "name": '福特'
                        };

                        // 在这里要注意,尽管flask接收的格式为json,并且设置了跨域处理,使用axios还是不能直接使用json发送请求
                        // 需要将请求体还为 json格式的字符串,然后 headers 设置为 text/plain 才可以正常发送请求。
                        axios({
                                method: 'post',
                                url: 'http://127.0.0.1:5000/add_list_json',
                                data: JSON.stringify(data),
                                headers: {
                                    'Content-Type': 'text/plain', 
                                }
                            })
                            .then(function(response) {
                                console.log(response);
                            })
                            .catch(function(error) {
                                console.log(error);
                            });
                            
                    },

                },

            });
        </script>

    </body>
</html>

4.在网页端查看发送的请求效果

4.1 发送get请求

image-20200226104958385

4.2 发送form格式的post请求

image-20200226105044299

4.3 发送json格式的post请求

image-20200226105200482

在上面看到已经能够正常接收请求返回的信息了,那么下面将逐个请求的具体内容显示出来。

5.打印请求的返回内容

5.1 打印get请求的返回内容

image-20200226114606114

                    getInfo() { // 发起get请求

                        axios.get('http://127.0.0.1:5000/get_list')
                            .then(function(response) {
                                console.log(response);
                                // 打印 data 数据
                                console.log(response.data.messages);
                                // 打印 status 数据
                                console.log(`status = ${response.status}`,);
                            })
                            .catch(function(error) {
                                console.log(error);
                            });

                    },

浏览器执行如下:

image-20200226114653656

5.2 打印form格式post请求的返回内容

image-20200226114926936

浏览器执行如下:

image-20200226115002933

5.3 打印json格式post请求的返回内容

image-20200226115139318

浏览器执行如下:

image-20200226115053227

配置axios的全局参数

前面的多个请求中,我在写url的时候是这样的,如下:

axios.get('http://127.0.0.1:5000/get_list')

每个请求都要带上服务的url地址http://127.0.0.1:5000其实挺麻烦的,这个参数可以设置为一个全局参数,不用每个接口都去写,设置如下。

6.配置axios请求的URL全局参数

image-20200226145512060

axios.defaults.baseURL = 'http://127.0.0.1:5000';

那么配置了这个根url的参数时候,其他接口只需要写后面的路径即可。

当然,axios还提供了更多的全局参数。

7.查看更多的axios全局参数

http://www.axios-js.com/zh-cn/docs/index.html

image-20200226145703554

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';

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 29. Vue 使用 vue-resource 发起post请求,删除列表数据

    定义数据列表为全局变量data_list,开发del_list视图函数根据id删除data_list数据,开发get_list读取data_list数据。

    Devops海洋的渔夫
  • CSS 去除ul的li标签前面小点 list-style: none;

    在开发html的页面中,经常需要使用ul无序列表来写菜单栏目,但是由于前面的小点是不美观的,而且不同的浏览器也是不兼容的。

    Devops海洋的渔夫
  • Flask 静态文件、模板文件设置

    在Django项目中,如果需要访问静态文件,默认则是使用 /static 的前缀来进行访问。那么对于Flask来说,也是一样的。

    Devops海洋的渔夫
  • 为什么重复的GET请求变慢了?

    最近在研究慢请求监控的问题,写了一个简单的测试代码:在网页端(index.html)通过fetch函数向服务端获取数据,然后打印请求耗时。

    Fundebug
  • 数据库死锁怎么分析?

    我们为hero表的id列创建了聚簇索引,为name列创建了一个二级索引。这个hero表主要是为了存储三国时的一些英雄,我们向表中插入一些记录:

    黄泽杰
  • Python3之api

            主要用到django,request,json,orm,HttpResponse

    py3study
  • 10、web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    1、首先,终端执行命令升级pip: python -m pip install --upgrade pip

    天降攻城狮
  • 051Android 虚拟机基本概念无标题文章

    上善若水.夏
  • 浪潮 如何构建人工智能时代的2.0生态

    走进浪潮2019年IPF的上海大会现场,发现大会的主题,从连续几年的“聚浪成潮”已经升级为“智慧凝聚”,再看参加浪潮活动的生态伙伴,尤其演讲嘉宾,也发生重大变化...

    人称T客
  • Bootstrap Bootstrap表格插件bootstrap-table配置与应用小结

    https://gitee.com/ishouke/front_end_plugin/blob/master/jquery-3.2.1.min.js

    授客

扫码关注云+社区

领取腾讯云代金券