1. 前后端通信

1.1. axios

1.1.1. 安装与使用

npm install axios

axios提供了多种简化HTTP请求的方法,使得与RESTful API的交互变得简单直观。以下是axios常用的几种方法。

[插图] axios.get(url[, config]):用于发送GET请求,获取数据。

[插图] axios.post(url, data[, config]):用于发送POST请求,提交数据。

[插图] axios.put(url, data[, config]):用于发送PUT请求,更新全部数据。

[插图] axios.delete(url[, config]):用于发送DELETE请求,删除数据。

[插图] axios.patch(url, data[, config]):用于发送PATCH请求,更新部分数据。

1.1.2. GET请求

import axios from 'axios';
// 发送 GET 请求
axios.get('https://api.example.com/items')
  .then(response => {
    console.log(response.data);                    // 处理响应数据
  })
  .catch(error => {
    console.error('Error fetching data:', error);  // 处理错误
  });

1.1.3. POST请求

。
import axios from 'axios';
const item = {
  title: 'New Item',
  description: 'Description of the new item'
};
axios.post('https://api.example.com/items', item)
  .then(response => {
    console.log('Item created:', response.data);             // 处理响应数据
  })
  .catch(error => {
    console.error('Error creating item:', error);  // 处理错误
  });

1.1.4. config对象

axios的config对象是一个可选参数,用于自定义请求的各种设置。以下是一些常见的配置选项和使用方法。

[插图] headers:自定义请求头。

[插图] params:URL参数,主要用于GET请求。

[插图] responseType:响应数据类型,如json、blob、document等。

[插图] timeout:设置请求的超时时间(毫秒)。

1.1.4.1. GET请求时带有URL参数

axios.get('https://api.example.com/items', {
  params: {
    userID: 12345
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

在这个示例中,params对象包含要附加到URL的查询参数,如userID: 12345。这将使请求的完整URL变为https://api.example.com/items?userID=12345

1.1.4.2. POST请求中设置自定义头部

axios.post('https://api.example.com/items', {
  title: 'New Item',
  description: 'Description of the new item'
}, {
  headers: {
    'Content-Type': 'application/json'
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

在这个示例中,axios.post()方法的第三个参数是配置对象。这里的headers设置了请求头部,指定'Content-Type': 'application/json',告诉服务器发送的数据是JSON格式。

1.1.5. 结合vue组件

在mounted中发送请求,示例如下。

<script setup>
  import { onMounted } from 'vue';
import axios from 'axios';
onMounted(() => {
  axios.get('https://api.example.com/data')
    .then(response => {
      // 处理响应数据
      // 如更新组件的状态
    })
    .catch(error => {
      // 处理错误情况
      // 如显示错误消息
    });
});
</script>

代码解释如下。

[插图] 使用onMounted钩子确保请求在组件完全加载和渲染之后发出。

[插图] 在请求的.then部分处理服务器的响应,可以更新组件的状态或处理数据。

[插图] 在.catch部分处理可能发生的错误,如网络问题或服务器错误。

1.1.6. 结合async/await

当结合使用axios和async/await时,可以更简洁且高效地处理HTTP请求和响应。Async/await是一种现代的JavaScript异步处理方法,能够以更接近同步编程的风格编写异步代码。

相比基于回调或.then().catch()的链式调用,async/await提供了更直观且易于理解的代码结构。使用axios与async/await的优化步骤如下。

(1)使用axios的各种方法(如get、post、put、delete等)发送请求,这些方法返回一个Promise对象。

(2)在标记为async的函数中,使用await关键字来暂停函数执行,直到Promise被解决(即请求完成)。

(3)这种方式允许将异步HTTP请求的结果直接赋值给变量,例如,const response =await axios.get('https://api.example.com/data');

async/await语法的另一个优势是简化了错误处理。通过将请求逻辑封装在try…catch块中,可以更容易地捕获并处理请求过程中可能发生的任何异常。在catch块中,可以处理这些异常,如打印错误信息或对用户显示错误提示。

import axios from 'axios';
async function fetchData() {
  try {
    const response = await axios.get('https://api.example.com/data');
    console.log(response.data);                              // 处理响应数据
  } catch (error) {
    console.error('Error fetching data:', error);            // 处理错误
  }
}
fetchData();

在这个示例中:

[插图] fetchData是一个异步函数,用于发送HTTP GET请求。

[插图] 使用await axios.get(…)发送请求,并等待响应。

[插图] 如果请求成功,则response.data包含响应数据。如果请求失败,则catch块捕获并处理错误

1.1.7. Multipart请求

(1)创建FormData实例:FormData用于构建一组键-值对,代表表单字段和其值。

(2)添加数据到FormData:使用append()方法向FormData对象添加数据。这些数据可以是文本字段或文件。

(3)发送请求:使用axios发送请求,将FormData对象作为请求体。

基于上述步骤的完整示例如下。

import axios from 'axios';
// 创建 FormData 实例
const formData = new FormData();
// 添加文本字段
formData.append('username', 'exampleUser');
formData.append('email', 'user@example.com');
// 添加文件,这里的fileInput是一个指向文件输入元素的引用
// 假设fileInput是一个包含文件的HTML input元素
const fileInput = document.querySelector('input[type="file"]');
if (fileInput.files[0]) {
  formData.append('profilePicture', fileInput.files[0]);
}
// 发送Multipart请求
axios.post('https://api.example.com/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})
  .then(response => {
    console.log('Upload successful:', response.data);
  })
  .catch(error => {
    console.error('Upload error:', error);
  });

在这个例子中:

[插图] 使用FormData的append()方法添加了文本字段和文件。

[插图] 在发送axios请求时,通常设置Content-Type为multipart/form-data。

[插图] axios将formData对象作为请求体发送,服务器将接收到一个Multipart请求。

从axios v0.27.0版本开始,当请求头中的Content-Type设置为multipart/form-data时,axios会自动将普通对象序列转换成一个FormData对象,从而简化了发送Multipart请求的过程。

示例代码如下。

import axios from 'axios';
// 普通的JavaScript对象
const data = {
  username: 'exampleUser',
  email: 'user@example.com',
  // 文件引用需要从文件输入元素获取
  profilePicture: document.querySelector('input[type="file"]').files[0]
};
// 发送Multipart请求
axios.post('https://api.example.com/upload', data, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})
  .then(response => {
    console.log('Upload successful:', response.data);
  })
  .catch(error => {
    console.error('Upload error:', error);
  });

在这个例子中,data是一个包含用户名、电子邮件和文件的普通JavaScript对象,axios会在内部将这个对象转换为FormData实例。

此种方式无须手动创建和填充FormData,除非要进行更复杂的操作(如追加多个文件或设置复杂的数据结构)。

1.1.8. Vue全局配置

全局配置axios实例并设定baseURL是Vue 3应用中的一个实用做法。这主要适用于那些所有HTTP请求都指向同一API端点的应用,可以有效减少代码重复并提高维护效率。

要实现Vue全局配置,在Vue 3项目中,首先需要创建一个配置了baseURL的axios实例。后续的请求发送都通过此实例完成,以确保所有的HTTP请求都自动使用这个baseURL。

1.1.8.1. 创建并配置axios实例

例如,新建axios.js文件,代码如下。

// src/axios.js
import axios from 'axios';
const axiosInstance = axios.create({
  baseURL: 'https://api.example.com' // 替换为API基础URL
});
export default axiosInstance;

代码解释如下。

[插图] axios.create()方法创建自定义axios实例,在方法中可以配置基础URL、头部、超时时间等信息。

[插图] baseURL被设置为https://api.example.com。这意味着对于这个axios实例发起的任何请求,这个URL都将作为请求URL的前缀。例如,使用这个实例调用.get('/users'),那么实际请求的URL将是https://api.example.com/users。从而避免在每个请求中重复写入完整的URL。

1.1.8.2. 导入并挂载axios实例

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import axios from './axios';
const app = createApp(App);
app.config.globalProperties.$axios = axios; // 将axios添加到Vue全局属性
app.mount('#app');

代码解释如下。

[插图] 在Vue 3中,app.config.globalProperties用于定义全局属性。这些属性在应用的所有组件中都是可用的。这意味着一旦某个属性被添加到globalProperties,它就可以在应用中的任何组件内通过this关键字被访问。

[插图] app.config.globalProperties.$axios = axios;这行代码实际上是在globalProperties对象上创建了一个新的属性$axios,并将其值设置为导入的axios实例。这样做的结果是,在Vue应用的任何组件中都可以通过this.$axios访问到这个axios实例。

1.1.8.3. 使用

<script setup>
import { ref, getCurrentInstance } from 'vue';
const responseData = ref(null);
const { proxy } = getCurrentInstance();                // 获取组件实例
const fetchData = async () => {
  try {
    // 使用相对路径,baseURL 会自动加上
    const response = await proxy.$axios.get('/items');
    responseData.value = response.data;                 // 存储响应数据
  } catch (error) {
    console.error('Error fetching data:', error);       // 处理错误
  }
};
fetchData();
</script>

代码解释如下。

[插图] 创建响应式变量:使用ref创建名为responseData的响应式变量,用于存储从服务器获取的数据。

[插图] 定义异步函数fetchData:此函数负责执行HTTP请求并处理响应。

[插图] 发起GET请求:使用proxy.$axios.get('/items')发送请求。这里proxy是Vue组件实例,通过它来访问全局属性$axios。'/items'是请求的相对路径,完整的URL由baseURL和此相对路径组成。

[插图] 处理响应和异常:如果请求成功,则存储响应数据到responseData;如果请求失败,则使用catch块捕获错误并在控制台输出错误信息。0