Doc: 使用 Axios 发送 GET/POST 请求
1. 概要
在本周的学习中,我们将深入学习如何通过 Axios 发送 HTTP 请求。Axios 是一个非常流行的 JavaScript 库,用于从前端与后端进行通信。通过它,我们可以轻松发送 GET、POST 请求,获取或提交数据,进而实现与服务器的交互。
Axios vs XMLHttpRequest & Fetch
通常,JavaScript 提供了 XMLHttpRequest
和 fetch
这两种方式来进行 HTTP 请求。而 Axios 在这些传统方法的基础上,提供了简洁的 API 和更多的功能,能够更加方便地处理请求和响应。
- 自动解析 JSON:Axios 会自动把服务器返回的 JSON 格式数据转成 JavaScript 对象,而
fetch
需要手动解析。 - 简洁的错误处理:Axios 会在 HTTP 请求失败时自动抛出错误,而
fetch
只有在请求出现网络错误时才抛出异常,HTTP 错误(如 404、500)不会被自动视为错误。
本章目标
- 学习如何安装和使用 Axios。
- 使用 Axios 发送 GET 和 POST 请求。
- 学会在 Vue 中处理请求和响应。
WARNING
Doc 中提到的 API 都是虚构的,并未实际架设到 duke486.com 上,请不要直接执行这里的代码。此外,lab 与 homework 中涉及的 API 在校内培训期间会保持开放,但不保障长期运行。如有需要请借助 AI 等工具编写测试用的服务端代码,以此检查自己的前端项目能否正常工作。
跨域问题
前后端运行在不同地址时,可能会遇到跨域问题。 例如在自己的电脑上运行前端应用,请求 duke486.com
时。
为什么会有跨域问题?
跨域资源共享(CORS) 是浏览器的安全机制,防止一个网站的脚本访问另一个域名下的资源。换句话说,如果你的前端应用(例如 localhost
)向 duke486.com
发送请求,浏览器会认为这是一个 跨域请求。
跨域问题的根本原因是:前端应用的源( localhost
或任何本地开发环境)与后端服务器的源( duke486.com
)不同,这时浏览器会阻止前端访问后端的数据,除非后端明确允许跨域请求。
解决跨域问题:
服务器端支持 CORS
如果服务器端(duke486.com
)在响应头中加入了 CORS 相关的字段,如:javascriptAccess-Control-Allow-Origin: *
1或者
javascriptAccess-Control-Allow-Origin: http://localhost:3000
1那么浏览器就不会阻止跨域请求,前端可以正常获取数据。
注意: 在本 Week 中
duke486.com
的 API 已经启用了 CORS使用代理
如果duke486.com
服务器没有启用 CORS,作为前端开发者,你可以使用代理来绕过这个限制。具体做法是在本地开发环境中设置一个代理服务器。这样请求首先会发送到代理服务器,再由代理服务器转发到duke486.com
,从而避免浏览器的跨域限制。Vite 配置代理:我们使用的是 Vite+Vue,可以在
vite.config.js
中配置代理:js// vite.config.js export default { server: { proxy: { '/api': 'https://duke486.com', // 将请求转发到真实的API地址 }, }, };
1
2
3
4
5
6
7
8这样,前端请求
/api
会被代理到https://duke486.com/api
,避免跨域问题。
2. 新人物介绍
望月红叶
红叶是青叶的朋友,温泉旅馆的老板的女儿。她最近向青叶介绍了她们旅馆的自助查询系统,青叶十分好奇这个系统是如何运作的。红叶告诉她,旅馆的自助查询系统是通过一个 API 接口获取预定信息的,客户只需要输入预定 ID,就能看到自己的房间信息。青叶决定也要学习如何通过 API 请求来实现类似的功能。
截至目前,大家的职位如下:
3. 基础知识
3.1 如何安装 Axios
要在 Vue 项目中使用 Axios,我们首先需要安装 Axios 库。创建一个新的 vue 项目并进入项目目录。
在终端中执行以下命令来安装 Axios:
pnpm install axios
3.2 在 Vue 项目中引入 Axios
安装完成后,我们需要在 Vue 项目中引入 Axios。通常,你可以在需要发送请求的组件或文件中引入它。Axios 的引入并不需要在 vite.config.js
中进行配置。直接在你想用 Axios 的文件中引入即可。
比如,在一个 Vue 组件中,你可以这样引入:
import axios from 'axios';
3.3 发送 GET 请求
发送 GET 请求的基本语法如下:
axios.get(url)//这是目标URL
.then(response => {
console.log(response.data); // 处理服务器返回的数据
})
.catch(error => {
console.error('请求失败:', error); // 处理错误
});
2
3
4
5
6
7
示例:通过 GET 请求获取数据
假设我们要从服务器获取某个用户的预定信息。发送的请求代码如下:
import axios from 'axios';
axios.get('https://duke486.com/api/reservations/101')
.then(response => {
//response是获取到的响应
console.log('预定信息:', response.data);
})
.catch(error => {
console.error('请求失败:', error);
});
2
3
4
5
6
7
8
9
10
请求的响应格式
假设你向 https://duke486.com/api/reservations/101
发送了 GET 请求,服务器的响应(返回的数据)可能是如下的 JSON 格式:
{
"status": "success",
"data": {
"userId": 101,
"reservationStartDate": "2024-12-10",
"reservationEndDate": "2024-12-12",
"roomType": "B202"
}
}
2
3
4
5
6
7
8
9
如何理解这个响应:
-
status
: 表示请求的状态,success
表示请求成功。 -
data
: 这里包含了具体的预定信息,如用户 ID、起始日期、结束日期以及房间类型。
你可以通过 response.data
来获取这个数据并在页面上展示。
3.4 发送 POST 请求
POST 请求用于向服务器发送数据。例如,当用户提交表单时,你可能需要使用 POST 请求将数据发送到服务器。
发送 POST 请求的基本语法:
axios.post(url, data)
.then(response => {
console.log('服务器响应:', response.data);
})
.catch(error => {
console.error('请求失败:', error);
});
2
3
4
5
6
7
示例:通过 POST 请求发送数据
假设你需要将用户填写的预定信息提交到服务器,代码如下:
const reservationData = {
userId: 101,
reservationStartDate: '2024-12-10',
reservationEndDate: '2024-12-12',
roomType: 'B202'
};
axios.post('https://duke486.com/api/reservations', reservationData)
.then(response => {
console.log('预定成功:', response.data);
})
.catch(error => {
console.error('请求失败:', error);
});
2
3
4
5
6
7
8
9
10
11
12
13
14
POST 请求的响应示例
服务器可能会返回如下的响应数据:
{
"status": "success",
"message": "预定成功",
"data": {
"reservationId": 12345,
"userId": 101,
"reservationStartDate": "2024-12-10",
"reservationEndDate": "2024-12-12",
"roomType": "B202"
}
}
2
3
4
5
6
7
8
9
10
11
这个响应表明预定已经成功,服务器还返回了一个 reservationId
,即预定的 ID。
3.5 错误处理
在实际开发中,错误处理是至关重要的,尤其是在进行网络请求时。Axios 会捕获请求中的所有错误,无论是网络问题,还是服务器返回错误的状态码(如 404 或 500)。
如何处理错误
axios.get('https://duke486.com/api/reservations/101')
.then(response => {
console.log('预定信息:', response.data);
})
.catch(error => {
if (error.response) {
// 服务器返回了状态码,且不是2xx的响应
console.error('响应错误:', error.response.status, error.response.data);
} else if (error.request) {
// 请求已经发送,但没有收到响应
console.error('没有收到响应:', error.request);
} else {
// 其他错误
console.error('请求错误:', error.message);
}
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在这个错误处理的示例中:
-
error.response
:表示服务器返回了错误的响应,例如 404(未找到)或 500(服务器错误)。 -
error.request
:表示请求已成功发送,但没有收到响应。这通常表示网络连接有问题。 -
error.message
:表示发生了其他类型的错误,例如请求的语法错误。
4. 情景案例
角色引导:青叶询问红叶如何查询预定日期的 API
青叶好奇地问红叶:旅馆前台有个自助查询系统,用户只需要输入 ID 就能查询自己的预定信息。这是怎么实现的呢?
红叶则回答道:其实很简单,我们店使用了一个 API 接口,当用户输入他们的 ID 时,系统就向我们的服务器发送请求,返回他们的预定信息。
思考过程:从需求到实现
青叶决定实现一个简单的 API 查询系统,来展示用户的预定信息。她需要:
- 使用 GET 请求获取某个用户的预定信息。
- 在 Vue 组件中展示这些信息。
步骤讲解:
- 设计 API 接口:API 接口通过 GET 请求获取预定数据,URL 为
https://duke486.com/api/reservations/{userId}
,其中{userId}
是用户的 ID。 - 发送 GET 请求:青叶使用 Axios 发送 GET 请求,获取用户的预定信息。
- 解析返回的数据:获取的数据包括起始日期、结束日期和房间类型等,青叶将这些数据展示在页面上。
代码:如何在 Vue 组件中使用 Axios 完成 API 请求并显示数据
<template>
<div>
<h1>用户预定信息</h1>
<p>房间类型:{{ reservation.roomType }}</p>
<p>预定日期:{{ reservation.reservationStartDate }} 至 {{ reservation.reservationEndDate }}</p>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
reservation: {} // 用来存储预定数据
};
},
mounted() {
// 组件加载时发送请求
axios.get('https://duke486.com/api/reservations/101')
.then(response => {
this.reservation = response.data.data; // 获取数据并赋值
})
.catch(error => {
console.error('请求失败:', error);
});
}
};
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
解析:
1. 在`mounted()`钩子中发送GET请求。
2. 获取到的数据通过`response.data.data`获取,因为实际的预定信息是在`data`字段下。
3. 使用`{{ reservation.roomType }}`和`{{ reservation.reservationStartDate }}`等绑定数据。
2
3
5. 总结
通过本章的学习,你已经掌握了使用 Axios 发送 GET 和 POST 请求、处理响应数据的基本写法,并在 Vue 组件中展示它们。同时,我们也学会了如何处理可能出现的请求错误。
- Axios 安装与引入:通过
pnpm install axios
安装,并在需要的文件中通过import axios from 'axios'
引入。 - GET 与 POST 请求:掌握了如何通过 Axios 发送 GET 和 POST 请求,理解请求和响应的数据结构。
- 错误处理:学会了如何捕获并处理请求中的错误,确保应用稳定运行。