首页 > 其他分享 >vue与后端的数据交互

vue与后端的数据交互

时间:2024-04-28 20:33:41浏览次数:23  
标签:vue 请求 交互 端的 json axios error data response

一、前后端数据交互

简单的前后端数据交互流程:
· 在前端(浏览器)中发起HTTP请求:使用前端框架(如Vue.js)或者原生JavaScript,您可以通过发送HTTP请求(如GET、POST、PUT、DELETE)向后端服务器请求数据。
· 后端服务器处理请求:后端服务器接收到前端发送的HTTP请求,并根据请求的类型和参数进行处理。根据具体业务需求,后端可能会从数据库中检索数据、执行某些计算或操作,并准备好要返回给前端的数据。
· 后端返回响应数据:后端服务器将处理后的数据封装成HTTP响应,并发送回前端。通常,响应数据使用某种数据格式(如JSON)进行编码。
· 前端接收响应数据:前端(浏览器)收到后端返回的HTTP响应后,解析响应数据。使用前端框架或原生JavaScript,您可以提取所需的数据。
· 前端数据渲染:一旦前端获取到数据,您可以将其应用于您的用户界面,进行数据渲染和展示。这可以通过使用模板引擎、Vue组件或JavaScript操作DOM等方式来实现。

二、前端调用接口的方式

· ajax
· jquery的ajax
· fetch
· axios

三、后端使用方式选择

· 使用Flask搭建后端
· 使用django搭建后端
本文提供两种方式进行验证

一、使用Flask搭建后端

背景:在当前的pycharm使用
· 在pycharm安装flask模块(找到Terminal---->执行命令安装: pip install Flask)
新建flask_text.py文件
代码展示:

from flask import Flask,jsonify
app = Flask(__name__)

@app.route('/',methods=['GET'])
def index():
    return 'Hello World!'

@app.route('/userinfo',methods=['GET'])
def userinfo():
    # 提交要在前端展示的信息:{'username':'quan','age':23}
    res= jsonify({'username':'quan','age':23})
    # res.headers={'Access-Control-Allow-Origin':'*'}
    # 添加跨域信息
    res.headers.add('Access-Control-Allow-Origin','*')
    return res
  
if __name__ == '__main__':
    app.run()
备注: 一般需要解决提交请求时会出现的跨域问题,需要在请求头重添加CORS(当前使用的背景是Flask),也就是在flask中添加CORS(跨域资源共享)的中间件/或者可以在当前的路由处理函数中手动添加跨域头(当前行为是在后者)

1、基于jQuery的ajax前后端的交互模式

基于jQuery的Ajax(Asynchronous JavaScript and XML)是一种前后端交互模式,它利用JavaScript和XML(现在也可以使用JSON)来在Web应用程序中进行异步通信。它允许通过在不刷新整个页面的情况下从服务器获取数据和更新页面的内容。

· 使用基于jQuery的Ajax,可以通过以下步骤实现前后端交互:

1、引入jQuery库:首先,在HTML页面中引入jQuery库文件,这样就可以使用jQuery的函数和方法。
		· 可以使用cdn直接从官网获取
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
		· 也可以直接将数据下载下来放在本地直接使用
    <script src="js/jq.js"></script>
2、编写ajax请求:使用jQuery的$.ajax()方法来发送异步请求到服务器。该方法接受一个包含各种选项的JavaScript对象作为参数,用于配置请求的细节,例如URL、请求类型(GET、POST等)、数据等。
                $.ajax({
                    url:'http://127.0.0.1:5000/userinfo',
                    method:'get',
                    //success: function (data){  优化
                    success: data=>{
                        // CORS policy 跨域问题---》解决---》后端响应头加
                        // console.log(data)  // 前端获取{age: 23, username: 'quan'}
                        console.log(typeof data)
                        //如果这里传过来的值是字符串类型就需要转json格式
                        data = JSON.parse(data)
                        this.username = data.username
                        this.age = data.age
                    }
                })
在上面的代码中,我们指定了请求的URL、类型为GET,还传递了一些数据。成功回调函数在服务器响应成功时触发

处理服务器响应:根据服务器返回的数据,可以在成功回调函数中执行一些操作。例如,更新页面内容、显示数据等。在上面的示例中,我们使用console.log()将响应数据打印到浏览器的控制台。
通过这种方式,前端可以通过Ajax向后端发送请求并处理响应,从而实现动态更新页面内容,而无需刷新整个页面。这种交互模式在创建交互性强、用户体验良好的Web应用程序时非常有用。

完整代码展示:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.2/vue.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jq.js"></script>
</head>
<body>
<div id="app">
    <h1>与后端交互</h1>
    <button @click="handleLoad">加载用户信息</button>
    <p>用户名:{{username}}</p>
    <p>年龄:{{age}}</p>
</div>

</body>

<script>
    var vm = new Vue({
        el: '#app',
        data:{
            username:'',
            age:'',

        },
        methods:{
            handleLoad() {
                // 后端发请求拿到数据,赋值给username和age页面就能展示
                // 发送请求方式1: 使用jq的ajax
                $.ajax({
                    url:'http://127.0.0.1:5000/userinfo',
                    method:'get',
                    //success: function (data){  优化
                    success: data=>{
                        // CORS policy 跨域问题---》解决---》后端响应头加
                        // console.log(data)  // 前端获取{age: 23, username: 'quan'}
                        console.log(typeof data)
                        //如果这里传过来的值是字符串类型就需要转json格式
                        data = JSON.parse(data)
                        this.username = data.username
                        this.age = data.age
                    }
                })
            }
        }
    })
</script>
</html>

2、使用fetch前后端交互模式

1 fetch基本用法
fetch(url)
  .then(response => response.json())  // 解析响应为 JSON
  .then(data => console.log(data))    // 打印出解析后的数据,这里得到的才是真数据
  .catch(error => console.log('Error:', error)); // 捕获并打印任何出错信息

(关于fetch的更详细的使用将放在后面介绍)

2 编写当前需求下的用fetch进行交互的代码块
     fetch('http://127.0.0.1:5000/userinfo')
                        .then(response=>{response.json();
                        }).then(myjson=> {
                        this.username = myjson.username
                        this.age = myjson.age	
                    });
完整的代码展示:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.2/vue.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jq.js"></script>
</head>
<body>
<div id="app">
    <h1>与后端交互</h1>
    <button @click="handleLoad">加载用户信息</button>
    <p>用户名:{{username}}</p>
    <p>年龄:{{age}}</p>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data:{
            username:'',
            age:'',
        },
        methods:{
            handleLoad() {
                // 后端发请求拿到数据,赋值给username和age页面就能展示
                //发送请求方式二: 使用原生fetch发送请求
                fetch('http://127.0.0.1:5000/userinfo')
                    .then(response=>{response.json();
                    }).then(myjson=> {
                    this.username = myjson.username
                    this.age = myjson.age
                });
            }
        }
    })
</script>
</html>

3、使用axios进行前后端交互模式

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

1、安装npm: npm install axios

2、 使用axios相关库
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

3、 编写当前需求下的关于axios的代码块:
              axios.get('http://127.0.0.1:5000/userinfo')
                                  .then(res=>{
                                      console.log(res.data);  //因为获取的数据(响应体的数据)不再data下因为当前获取的data里对应要的数据在里面的data中
                                      this.username=res.data.username
                                      this.age = res.data.age
                                  })
                                  .catch(error=>{
                                      console.log(error);
                                  });
完整代码展示:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.2/vue.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jq.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
    <h1>与后端交互</h1>
    <button @click="handleLoad">加载用户信息</button>
    <p>用户名:{{username}}</p>
    <p>年龄:{{age}}</p>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data:{
            username:'',
            age:'',
        },
        methods:{
            handleLoad() {
                // 后端发请求拿到数据,赋值给username和age页面就能展示
                // 发送请求方式1: 使用jq的ajax

                //发送请求方式二: 使用原生fetch发送请求
                // fetch('http://127.0.0.1:5000/userinfo')
                //     .then(response=>{
                //         return response.json();
                //     }).then(myjson=> {
                //     this.username = myjson.username
                //     this.age = myjson.age
                // });

                // 发送请求方式三; 使用axios发送
                axios.get('http://127.0.0.1:5000/userinfo')
                    .then(res=>{
                        console.log(res.data);  //因为获取的数据(响应体的数据)不再data下因为当前获取的data里对应要的数据在里面的data中
                        this.username=res.data.username
                        this.age = res.data.age
                    })
                    .catch(error=>{
                        console.log(error);
                    });
            }
        }
    })
</script>
</html>

二、使用django搭建后端

备注: 在使用django搭建后端,与使用flask的区别在于,django的搭建可能会需要的步骤更加繁琐一点,后面的使用方式和代码块是没有任何区别的,都分为上面三种方式,所以这里只展示如何搭建django,前端的数据可以直接用上面的三种方式进行交互即可
urls--路由层
新建路由用于展示数据
urlpatterns = [
    path('movies/', views.Movie, name='movies'),
]


视图层
import json

from django.http import JsonResponse



# Create your views here.

def Movie(request):
    if request.method == 'GET':
      #打开/读取本地的存储的数据
      # 如果是与上面的情况一样只输出一段的话可以直接定义一个值指定这个数据在response即可
        with open('static/file.json', 'r') as f:
            data= json.load(f)
        res = JsonResponse(data)
        res['Access-Control-Allow-Origin'] = '*'
        return res

扩展

1、如何使用flask框架事件对json文件进行增删改查操作的后端代码:

from flask import Flask, request, jsonify
from flask_cors import CORS
import json

# 为了避免进行多的操作都需要做跨域的操作,直接注册在中间件即可
# 先下载CORS中间件 pip install flask-cors
app = Flask(__name__)
CORS(app)

# 读取JSON文件
def read_json_file(file_path):
    with open(file_path, 'r') as file:
        data = json.load(file)
    return data

# 编辑JSON文件
def write_json_file(file_path, data):
    with open(file_path, 'w') as file:
        json.dump(data, file, indent=4)

# 获取所有数据
@app.route('/data', methods=['GET'])
def get_all_data():
    json_data = read_json_file('data.json')
    response = jsonify(json_data)
    return response

# 获取单个数据
@app.route('/data/<id>', methods=['GET'])
def get_data(id):
    json_data = read_json_file('data.json')
    for item in json_data:
        if item['id'] == id:
            response = jsonify(item)
            return response
    response = jsonify({'message': 'Data not found'})
    return response

# 添加数据
@app.route('/data', methods=['POST'])
def add_data():
    json_data = read_json_file('data.json')
    new_data = {
        'id': request.json['id'],
        'name': request.json['name'],
        'age': request.json['age']
    }
    json_data.append(new_data)
    write_json_file('data.json', json_data)
    response = jsonify({'message': 'Data added successfully'})
    return response

# 更新数据
@app.route('/data/<id>', methods=['PUT'])
def update_data(id):
    json_data = read_json_file('data.json')
    for item in json_data:
        if item['id'] == id:
            item['name'] = request.json.get('name', item['name'])
            item['age'] = request.json.get('age', item['age'])
            write_json_file('data.json', json_data)
            response = jsonify({'message': 'Data updated successfully'})
            return response
    response = jsonify({'message': 'Data not found'})
    return response

# 删除数据
@app.route('/data/<id>', methods=['DELETE'])
def delete_data(id):
    json_data = read_json_file('data.json')
    for item in json_data:
        if item['id'] == id:
            json_data.remove(item)
            write_json_file('data.json', json_data)
            response = jsonify({'message': 'Data deleted successfully'})
            return response
    response = jsonify({'message': 'Data not found'})
    return response

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

2、结合jquery的ajax前后端交互实现增删改查

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="vue.js"></script>
</head>

<body>
<div class="container-fluid">
  <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">
      <div id="app">
        <button @click="handleLoad" v-if="!dataLoaded">加载数据</button>
        <button @click="handleAdd">添加数据</button>
        <button @click="handleUpdate">更新数据</button>
        <button @click="handleDelete">删除数据</button>
        <hr>
        <div v-for="item in items" :key="item.id">
          <div>ID: {{ item.id }}</div>
          <div>名称: {{ item.name }}</div>
          <div>年龄: {{ item.age }}</div>
          <hr>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
  const app = Vue.createApp({
    data() {
      return {
        dataLoaded: false, // 标记数据是否已加载
        items: [] // 存储数据的数组
      };
    },
    methods: {
      handleLoad() {
        const vm = this;
        // 发送GET请求获取数据
        $.ajax({
          url: 'http://127.0.0.1:5000/data',
          type: 'get',
          crossDomain: true, // 启用跨域请求
          dataType: 'json', // 指定数据类型为JSON
          success(data) {
            vm.items = data; // 将获取的数据存储到items数组中
            vm.dataLoaded = true; // 将数据加载状态设置为已加载
          }
        });
      },
      handleAdd() {
        const vm = this;
        const newData = {
          id: '123',
          name: 'New Data',
          age: 25
        };
        // 发送POST请求添加数据
        $.ajax({
          url: 'http://127.0.0.1:5000/data',
          type: 'post',
          data: JSON.stringify(newData),
          contentType: 'application/json',
          crossDomain: true, // 启用跨域请求
          dataType: 'json', // 指定数据类型为JSON
          success() {
            vm.handleLoad(); // 添加数据成功后重新加载数据
          }
        });
      },
      handleUpdate() {
        const vm = this;
        const updatedData = {
          name: 'Updated Data',
          age: 30
        };
        // 发送PUT请求更新数据
        $.ajax({
          url: 'http://127.0.0.1:5000/data/123',
          type: 'put',
          data: JSON.stringify(updatedData),
          contentType: 'application/json',
          crossDomain: true, // 启用跨域请求
          dataType: 'json', // 指定数据类型为JSON
          success() {
            vm.handleLoad(); // 更新数据成功后重新加载数据
          }
        });
      },
      handleDelete() {
        const vm = this;
        // 发送DELETE请求删除数据
        $.ajax({
          url: 'http://127.0.0.1:5000/data/123',
          type: 'delete',
          crossDomain: true, // 启用跨域请求
          success() {
            vm.handleLoad(); // 删除数据成功后重新加载数据
          }
        });
      }
    },
    mounted() {
      console.log('当前状态:mounted');
      this.handleLoad();
    }
  });
  app.mount('#app');
</script>
</body>
</html>

3、比较详细的介绍fetch的使用

1、基本用法,见上述

2、fetch的请求参数常用配置选项

· method(String):定义 HTTP 请求方法。默认值为 ‘GET’。其他常见的值包括 ‘POST’、‘PUT’、‘DELETE’、‘HEAD’ 等。

· body(String / FormData / Blob / ArrayBufferView / ArrayBuffer / URLSearchParams / ReadableStream / FormData):定义请求的 body,用于 ‘POST’ 或 ‘PUT’ 请求。需要注意的是,你需要将 body 的数据转换为合适的格式,并在 headers 中设置正确的 ‘Content-Type’。

· headers(Object):定义请求的 HTTP 头。这是一个普通对象,其中的每个键值对都表示一个 HTTP 头的名称和值。默认值为空对象({})。

一个具有这些配置选项的 fetch 请求示例:

fetch('http://127.0.0.1:5000/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    key1: 'value1',
    key2: 'value2',
  }),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log('Error:', error));

在这个例子中,发送了一个 ‘POST’ 请求到 ‘http://127.0.0.1:5000/data’。在 headers 中设置了 ‘Content-Type’ 为 ‘application/json’,并且把一个 JavaScript 对象转换为 JSON 格式的字符串作为请求的 body。

3、fetchAPI的其他配置选项

· mode(String):定义请求的模式,比如 ‘cors’、‘no-cors’、‘same-origin’ 或 ‘navigate’。这将影响跨站请求的行为。
· credentials(String):定义是否应该在请求中包含凭证(如 cookies)。可能的值包括 ‘include’、‘same-origin’、‘omit’。
· cache(String):定义请求的缓存模式。可能的值包括 ‘default’、‘no-store’、‘reload’、‘no-cache’、‘force-cache’、‘only-if-cached’。
· redirect(String):定义如何处理重定向。可能的值包括 ‘follow’、‘error’、‘manual’。
· referrer(String):定义请求的 referrer。可能的值是任何有效的 URL。
· referrerPolicy(String):定义请求的 referrer 策略。可能的值包括 ‘no-referrer’、‘no-referrer-when-downgrade’、‘origin’、‘origin-when-cross-origin’、‘same-origin’、‘strict-origin’、‘strict-origin-when-cross-origin’、‘unsafe-url’。
· integrity(String):一个包含请求的子资源完整性描述(SRI)的字符串。

4、Response对象

fetch() 返回的 Response 对象表示服务器对 fetch 请求的响应。Response 对象有很多属性,比如 status(表示 HTTP 响应码)和 headers(表示响应头)。还可以调用一些方法来获取响应体的内容,比如 text() 或 json()。

fetch(url)
  .then(response => response.json())
  .then(data => console.log(data));
    
在上述示例中,首先调用 fetch() 发送请求。然后,当服务器返回响应时,调用 json() 方法来解析响应体中的 JSON 数据。最后,把解析后的数据打印到控制台。

5、错误处理

可以使用 catch() 方法来捕获 fetch() 中可能出现的任何错误。

fetch(url)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.log('Error:', error));

6、异步处理

由于 fetch() 返回的是一个 Promise,所以你可以使用 async/await 语法来简化你的代码。

async function fetchData() {
  try {
    let response = await fetch(url);
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.log('Error:', error);
  }
}
fetchData();

在这个示例中,我们创建了一个异步函数 fetchData(),在这个函数中,我们使用 await 关键字来等待 fetch() 和 json() 方法的结果。如果在这个过程中出现任何错误,我们就会捕获这个错误并打印到控制台。

7、通过fetch实现增删改查

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="vue.js"></script>
</head>

<body>
<div class="container-fluid">
  <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">
      <div id="app">
        <button @click="handleLoad" v-if="!dataLoaded">加载数据</button>
        <button @click="handleAdd">添加数据</button>
        <button @click="handleUpdate">更新数据</button>
        <button @click="handleDelete">删除数据</button>
        <hr>
        <div v-for="item in items" :key="item.id">
          <div>ID: {{ item.id }}</div>
          <div>名称: {{ item.name }}</div>
          <div>年龄: {{ item.age }}</div>
          <hr>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
  const app = Vue.createApp({
    data() {
      return {
        dataLoaded: false, // 标记数据是否已加载
        items: [] // 存储数据的数组
      };
    },
    methods: {
      handleLoad() {
        const vm = this;
        // 发送GET请求获取数据
        fetch('http://127.0.0.1:5000/data')
                .then(response => response.json())
                .then(data => {
                  vm.items = data; // 将获取的数据存储到items数组中
                  vm.dataLoaded = true; // 将数据加载状态设置为已加载
                })
                .catch(error => console.error(error));
      },
      handleAdd() {
        const vm = this;
        const newData = {
          id: '123',
          name: 'New Data',
          age: 25
        };
        // 发送POST请求添加数据
        fetch('http://127.0.0.1:5000/data', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(newData)
        })
                .then(() => vm.handleLoad()) // 添加数据成功后重新加载数据
                .catch(error => console.error(error));
      },
      handleUpdate() {
        const vm = this;
        const updatedData = {
          name: 'Updated Data',
          age: 30
        };
        // 发送PUT请求更新数据
        fetch('http://127.0.0.1:5000/data/123', {
          method: 'PUT',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(updatedData)
        })
                .then(() => vm.handleLoad()) // 更新数据成功后重新加载数据
                .catch(error => console.error(error));
      },
      handleDelete() {
        const vm = this;
        // 发送DELETE请求删除数据
        fetch('http://127.0.0.1:5000/data/123', {
          method: 'DELETE'
        })
                .then(() => vm.handleLoad()) // 删除数据成功后重新加载数据
                .catch(error => console.error(error));
      }
    },
    mounted() {
      console.log('当前状态:mounted');
      this.handleLoad();
    }
  });

  app.mount('#app');
</script>
</body>

</html>

4、axios的比较详细的功能介绍使用

1、基本使用:

执行get请求:

axios.get('/user?ID=12345') // 使用axios.get方法发送一个GET请求,请求的URL为'/user?ID=12345'
  .then(function (response) {
    // 这是请求成功后执行的代码块。response是服务器的响应。
    console.log(response);
  })
  .catch(function (error) {
    // 这是请求失败后执行的代码块。error是失败的错误信息。
    console.log(error);
  })
  .finally(function () {
    // 这是无论请求成功还是失败都会执行的代码块。
  });

执行post请求:

axios.get('/user?ID=12345') // 使用axios.get方法发送一个GET请求,请求的URL为'/user?ID=12345'
  .then(function (response) {
    // 这是请求成功后执行的代码块。response是服务器的响应。
    console.log(response);
  })
  .catch(function (error) {
    // 这是请求失败后执行的代码块。error是失败的错误信息。
    console.log(error);
  })
  .finally(function () {
    // 这是无论请求成功还是失败都会执行的代码块。
  });

2、执行多个并发请求

可以使用axios.all

axios.all([
  axios.get('/user/12345'),
  axios.get('/user/67890')
])
.then(axios.spread(function (userResp, user2Resp) {
  // 两个请求现在都已经完成
  console.log(userResp.data);
  console.log(user2Resp.data);
}));

3、错误处理

使用catch方法处理请求过程中的错误

axios.get('/user/12345')
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error);
  });

4、使用async/await

如果环境支持 async/await,那么可以使用这些特性来简化你的代码:

async function getUser() {
  try {
    const response = await axios.get('/user/12345');
    console.log(response.data);
  } catch (error) {
    console.log(error);
  }
}
getUser();

5、axios返回的响应对象主要属性

data:服务器响应的数据。这是我们通常最关心的部分,它包含了服务器返回的数据。
headers:服务器响应的头信息。这是一个对象,包含了响应的各种头部信息,如 ‘Content-Type’。
status:服务器响应的 HTTP 状态码。比如,200 表示请求成功,404 表示未找到,500 表示服务器错误等。
statusText:HTTP 状态消息。与状态码相对应,例如 “OK” 对应 200,“Not Found” 对应 404 等。
可以使用.then方法获取这些信息:
axios.get('/api/data')
  .then(response => {
    console.log(response.data);  // 访问返回的数据
    console.log(response.status);  // 访问状态码
    console.log(response.statusText);  // 访问状态消息
    console.log(response.headers);  // 访问响应头
  })
  .catch(error => {
    console.log(error);
  });

6、axios的常用配置选项

url (String):要请求的服务器 URL。
method (String):请求方法。默认是 ‘GET’。
baseURL (String):将被添加到 url 前面,除非 url 是绝对的。
headers (Object):自定义请求头。
params (Object):要与请求一起发送的 URL 参数,必须是纯对象或 URLSearchParams 对象。
data (Object, String, ArrayBuffer, ArrayBufferView, URLSearchParams, FormData, File, Blob):作为请求主体发送的数据。只适用于 ‘PUT’, ‘POST’, ‘PATCH’ 方法。
timeout (Number):指定请求超时之前的毫秒数。
withCredentials (Boolean):表示跨站点访问控制请求是否应该使用证书,如 cookies, authorization headers 或 TLS client certificates。默认为 false。
responseType (String):表示服务器将响应的数据类型。可能的值是 ‘arraybuffer’, ‘blob’, ‘document’, ‘json’, ‘text’, ‘stream’。
onUploadProgress (Function):允许处理上传的进度事件。
onDownloadProgress (Function):允许处理下载的进度事件。
validateStatus (Function):定义是否将 promise 解析为成功或失败,返回 true(或设置为 null 或 undefined)将 promise 状态设置为成功,返回 false 将状态设置为失败。


代码示例:
axios({
  url: '/user', // URL路径,将拼接到baseURL之后
  method: 'post', // 使用的HTTP方法
  baseURL: 'http://127.0.0.1:5000/', // 基础URL,除非URL是绝对路径,否则将被添加到URL之前
  headers: {'X-Requested-With': 'XMLHttpRequest'}, // 自定义请求头
  params: {
    ID: 12345 // URL查询参数,这将添加到URL后面 "?ID=12345"
  },
  data: {
    firstName: 'Fred', // 请求体数据,将转换为JSON字符串发送给服务器
    lastName: 'Flintstone'
  },
  timeout: 1000, // 请求超时时间,单位毫秒
  withCredentials: true, // 是否允许发送cookie,只有在同源请求时才会发送
  responseType: 'json', // 服务器响应的数据类型
})
.then(function(response) { // 请求成功的回调函数,response是服务器响应的信息
  console.log(response);
})
.catch(function(error) { // 请求失败的回调函数,error是失败的错误信息
  console.log(error);
});

这个例子中,我们向 ‘http://127.0.0.1:5000/’ 发送了一个 POST 请求,带有 query 参数 ID=12345 和请求主体,同时设置了一些其他配置。

7、拦截请求和相应

Axios允许你在请求发送给服务器之前,或当服务器的响应返回到then或catch方法之前,拦截请求或响应。拦截器可以对请求和响应进行预处理,对于处理API的统一请求参数、响应错误等通用处理场景十分有用。

· 请求拦截器:请求拦截器主要用于在请求发送前修改请求配置,比如设置通用的请求头、设置请求超时时间、在请求中携带用户token等等。请求拦截器接收请求配置作为参数,并且预计返回修改后的配置。
· 响应拦截器:响应拦截器主要用于处理请求返回的结果。我们可以在这里对返回结果进行提前处理,如统一处理错误信息、对返回结果进行提前处理等等。响应拦截器接收响应作为参数,并且预计返回处理后的响应。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在这里,我们可以修改请求配置,比如添加通用的请求头
    config.headers.common['Authorization'] = 'Bearer token';
    return config;  // 返回修改后的请求配置
}, function (error) {
    // 如果请求出错,我们在这里处理错误,例如显示错误提示
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 在这里,我们可以处理返回的响应。例如,如果服务器返回的状态不是 'success',我们可以抛出错误
    if (response.data.status !== 'success') {
        console.error('Data error:', response.data.message);
    }
    return response;  // 返回处理后的响应
}, function (error) {
    // 如果响应出错,我们在这里处理错误,例如显示错误提示
    return Promise.reject(error);
});

8、取消请求

有时,我们可能需要取消一个正在进行的HTTP请求。这可能是因为用户已经不再需要请求的结果,或者是因为我们需要避免并发请求。axios提供了一个取消令牌,我们可以使用它来取消请求。需要注意的是,一旦取消了请求,那么请求就无法再次使用。
var CancelToken = axios.CancelToken;
var source = CancelToken.source();

axios.get('/user/12345', {
    cancelToken: source.token  // 添加取消令牌到请求
}).catch(function (thrown) {
    if (axios.isCancel(thrown)) {  // 如果请求被取消,axios.isCancel会返回true
        console.log('Request canceled', thrown.message);
    } else {
        // 处理其他类型的错误
    }
});

// 在需要的时候取消请求
source.cancel('Operation canceled by the user.');

9、转换json数据

默认情况下,axios会自动将请求或响应的数据转换为JSON。这意味着,当我们发送请求时,如果请求体中的数据是一个JavaScript对象,那么axios会自动将其转换为JSON字符串。同样,当我们接收到响应时,如果响应体中的数据是JSON,那么axios会自动将其转换为JavaScript对象。

axios.get('/user/12345')
    .then(function (response) {
        console.log(response.data);  // response.data 已经被转换为 JavaScript 对象
    });

10、客户端防御XSRF

XSRF,也被称为跨站请求伪造,是一种常见的网络攻击手段。为了防止XSRF攻击,axios提供了一种机制:当浏览器环境设置了一个标准的 XSRF-TOKEN cookie时,你可以配置 axios 自动将它添加到请求头中,这样服务器可以验证请求的合法性。


// 如果浏览器环境设置了一个名为 'XSRF-TOKEN' 的 cookie,axios 会自动将它添加到名为 'X-XSRF-TOKEN' 的请求头中
axios.defaults.xsrfCookieName = 'XSRF-TOKEN';
axios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

11、axios增删改查

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="vue.js"></script>
  <!-- 引入 Axios -->
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>

<body>
<div class="container-fluid">
  <div class="row">
    <div class="col-md-6 col-md-offset-3" style="margin-top: 20px">
      <div id="app">
        <button @click="handleLoad" v-if="!dataLoaded">加载数据</button>
        <button @click="handleAdd">添加数据</button>
        <button @click="handleUpdate">更新数据</button>
        <button @click="handleDelete">删除数据</button>
        <hr>
        <div v-for="item in items" :key="item.id">
          <div>ID: {{ item.id }}</div>
          <div>名称: {{ item.name }}</div>
          <div>年龄: {{ item.age }}</div>
          <hr>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
  const app = Vue.createApp({
    data() {
      return {
        dataLoaded: false, // 标记数据是否已加载
        items: [] // 存储数据的数组
      };
    },
    methods: {
      handleLoad() {
        const vm = this;
        // 使用axios发送GET请求获取数据
        axios.get('http://127.0.0.1:5000/data')
                .then(response => {
                  vm.items = response.data; // 将获取的数据存储到items数组中
                  vm.dataLoaded = true; // 将数据加载状态设置为已加载
                })
                .catch(error => console.error(error));
      },
      handleAdd() {
        const vm = this;
        const newData = {
          id: '123',
          name: 'New Data',
          age: 25
        };
        // 使用axios发送POST请求添加数据
        axios.post('http://127.0.0.1:5000/data', newData)
                .then(() => vm.handleLoad()) // 添加数据成功后重新加载数据
                .catch(error => console.error(error));
      },
      handleUpdate() {
        const vm = this;
        const updatedData = {
          name: 'Updated Data',
          age: 30
        };
        // 使用axios发送PUT请求更新数据
        axios.put('http://127.0.0.1:5000/data/123', updatedData)
                .then(() => vm.handleLoad()) // 更新数据成功后重新加载数据
                .catch(error => console.error(error));
      },
      handleDelete() {
        const vm = this;
        // 使用axios发送DELETE请求删除数据
        axios.delete('http://127.0.0.1:5000/data/123')
                .then(() => vm.handleLoad()) // 删除数据成功后重新加载数据
                .catch(error => console.error(error));
      }
    },
    mounted() {
      console.log('当前状态:mounted');
      this.handleLoad();
    }
  });

  app.mount('#app');
</script>
</body>

</html>

标签:vue,请求,交互,端的,json,axios,error,data,response
From: https://www.cnblogs.com/queryH/p/18164434

相关文章

  • vue之计算属性与监听属性
    一、计算属性1、什么是计算属性--computed计算属性是Vue中的⼀种特殊属性,⽤于对已有的数据进⾏计算和衍⽣,以⽣成新的数据。计算属性的值是根据依赖的数据动态计算得出的,当依赖的数据发⽣变化时,计算属性会⾃动重新计算。2、计算属性的作用计算属性的主要作⽤是对数据进⾏处......
  • 为什么vue打印的对象在浏览器中显示...
    1.现象当在vue中打印对象的时候会发现有一些属性或者全部属性都是显示的...,点击展开后才能看到真正的值是什么.2.原因因为在vue中对象都是用了代理重写了get,由于get重写也就导致了浏览器不能直接获取到具体的值,因此才会在打印的时候为...,手动点击展开才显示具体的值......
  • vue3 引入workers 大量优化业务代码和复杂的计算的代码
    前沿vite页面引入worker在src新建一个 worker.d.ts文件declaremodule'*.worker.ts'{classWebpackWorkerextendsWorker{constructor();}exportdefaultWebpackWorker;}在 tsconfig.json页面引入"lib":["esnext",......
  • 『手撕Vue-CLI』添加自定义指令
    前言经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入nue--help来查看帮助信息了,但是在帮助信息中只有--version,--help这两个指令,而vue-cli中还有很多指令,例如create,serve,build等等,所以本章将继续添加自定义指令,例如create指令。添加create......
  • Vue系列---【如何关闭eslint校验?】
    如何关闭eslint校验?1.如果你的项目集成了eslint,但校验太严格,导致项目启动不了,你没时间排错,你可以找到vue.config.js,没有就创建,配上下面的内容。module.exports={//关闭eslint,因为校验太严格,例如:在main.js里定义了一个变量leta=100;,但未使用,就会导致项目启动不了......
  • 响应式原理(Vue3、Vue2)
    1.Vue3副作用函数(onMounted、watchEffect)帮助管理组件中的副作用逻辑,并自动追踪其依赖关系,以确保在数据变化时能够自动触发副作用函数的更新。会自动追踪被其内部函数引用的响应式数据。当这些数据发生变化时,Vue3会自动重新运行副作用函数,确保副作用与数据的状态保持同步。......
  • ant design pro vue项目搭建-运行项目
    1、克隆代码gitclone--depth=1https://github.com/vueComponent/ant-design-vue-pro.git2、依赖安装npminstall提示eslint版本报错  去除eslint,将package.json中eslint相关配置删除3、重新安装依赖完成,没有报错 npminstall 4、启动项目 npmrun......
  • 前端学习之vue简介
    vue的简单介绍#Vue诞生背景从历史的潮流来说,人们从之前的:原生JS->Jquery之类的类库->前端模板引擎,他们都有一个共同的特点需要我们去操作dom元素。近几年来,得益于手机设备的普及和性能的提升,移动端的web需求大量增加,产生了一种叫webapp的东西,也就是移动端的网页应用......
  • vue了解与初步接触/使用
    Vue使用1、vue的启动1、Vue的操作命令启动.Vue去你对应的包里直接yarnserve2、首先先需要检测自己是否安装了yarn命令yarn命令和npm的区别1、yarn是从国内下载npm是从国外下载所以yarn速度效率比较高,npm速度效率比较低2、yarn-v--可以检测到是否有yarn命......
  • vue和react有什么区别?
    (1)核心思想不同 vue:灵活易用的渐进式框架,进行数据拦截/代理,它对侦测数据的变化更敏感、更精确 react:React推崇函数式编程(纯组件),数据不可变以及单向数据流,当然需要双向的地方也可以手动实现,比如借助onChange和setState来实现(2)组件写法差异 vue:Vue推荐的做法是template......