_vue怎么使用后端提供的接口">
赞
踩
下面是一个简单的前后端数据交互流程:
因为Vue不操作DOM,所以用后两种
首先安装Flask 框架:
pip install Flask
然后新建data.json
文件:
[ { "id": "1", "name": "Alice", "age": 25 }, { "id": "2", "name": "Bob", "age": 30 }, { "id": "3", "name": "Charlie", "age": 35 } ]
为了解决前端提交请求时出现的跨域问题,在Flask应用程序中添加CORS(跨域资源共享)中间件。这样可以在服务器端处理跨域请求的头信息,而无需在每个路由处理函数中手动添加跨域头。
这里使用Flask-CORS扩展来简化这个过程。首先,确保已经安装了Flask-CORS扩展包。可以使用以下命令来安装:
pip install flask-cors
以下是使用Flask框架实现对JSON文件进行增删改查操作的后端代码:
from flask import Flask, request, jsonify from flask_cors import CORS import json 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()
基于jQuery的Ajax(Asynchronous JavaScript and XML)是一种前后端交互模式,它利用JavaScript和XML(现在也可以使用JSON)来在Web应用程序中进行异步通信。它允许通过在不刷新整个页面的情况下从服务器获取数据和更新页面的内容。
使用基于jQuery的Ajax,可以通过以下步骤实现前后端交互:
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
$.ajax()
方法来发送异步请求到服务器。该方法接受一个包含各种选项的JavaScript对象作为参数,用于配置请求的细节,例如URL、请求类型(GET、POST等)、数据等。$.ajax({
url: 'example.com/api/data',
type: 'GET',
data: { param1: 'value1', param2: 'value2' },
success: function(response) {
// 处理成功响应的回调函数
console.log(response);
},
error: function(xhr, status, error) {
// 处理错误响应的回调函数
console.log('Error:', error);
}
});
在上面的代码中,我们指定了请求的URL、类型为GET,还传递了一些数据。成功回调函数在服务器响应成功时触发,错误回调函数在出现错误时触发。
console.log()
将响应数据打印到浏览器的控制台。通过这种方式,前端可以通过Ajax向后端发送请求并处理响应,从而实现动态更新页面内容,而无需刷新整个页面。这种交互模式在创建交互性强、用户体验良好的Web应用程序时非常有用。
<!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>
更加简单的数据获取方式,功能更强大、更灵活,可以看做是的升级版
fetch(url)
.then(response => response.json()) // 解析响应为 JSON
.then(data => console.log(data)) // 打印出解析后的数据,这里得到的才是真数据
.catch(error => console.log('Error:', error)); // 捕获并打印任何出错信息
以下是一个具有这些配置选项的 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。
除了以上这些,fetch API 还支持许多其他的配置选项,包括:
fetch() 返回的 Response 对象表示服务器对 fetch 请求的响应。Response 对象有很多属性,比如 status(表示 HTTP 响应码)和 headers(表示响应头)。你还可以调用一些方法来获取响应体的内容,比如 text() 或 json()。
fetch(url)
.then(response => response.json())
.then(data => console.log(data));
在上述示例中,我们首先调用 fetch() 发送请求。然后,当服务器返回响应时,我们调用 json() 方法来解析响应体中的 JSON 数据。最后,我们把解析后的数据打印到控制台。
你可以使用 catch() 方法来捕获 fetch() 中可能出现的任何错误。
fetch(url)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log('Error:', error));
由于 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() 方法的结果。如果在这个过程中出现任何错误,我们就会捕获这个错误并打印到控制台。
<!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>
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。
使用 npm:
npm install axios
使用 bower:
bower install axios
使用 cdn:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
执行 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 () {
// 这是无论请求成功还是失败都会执行的代码块。
});
你可以使用 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);
}));
使用 catch
方法来处理请求过程中的任何错误:
axios.get('/user/12345')
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.log(error);
});
如果你的环境支持 async/await,那么可以使用这些特性来简化你的代码:
async function getUser() {
try {
const response = await axios.get('/user/12345');
console.log(response.data);
} catch (error) {
console.log(error);
}
}
getUser();
你可以使用 .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);
});
url
前面,除非 url
是绝对的。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 和请求主体,同时设置了一些其他配置。
Axios允许你在请求发送给服务器之前,或当服务器的响应返回到then或catch方法之前,拦截请求或响应。拦截器可以对请求和响应进行预处理,对于处理API的统一请求参数、响应错误等通用处理场景十分有用。
// 添加请求拦截器 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); });
有时,我们可能需要取消一个正在进行的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.');
默认情况下,axios会自动将请求或响应的数据转换为JSON。这意味着,当我们发送请求时,如果请求体中的数据是一个JavaScript对象,那么axios会自动将其转换为JSON字符串。同样,当我们接收到响应时,如果响应体中的数据是JSON,那么axios会自动将其转换为JavaScript对象。
axios.get('/user/12345')
.then(function (response) {
console.log(response.data); // response.data 已经被转换为 JavaScript 对象
});
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';
<!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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。