标签 axios 下的文章

Axios 发送请求示例
Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。相比 jQuery 的 Ajax,Axios 更加现代和强大。以下是各种 Axios 请求的示例

1. 安装 Axios
bash
npm install axios
# 或通过 CDN
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

2. 基本 GET 请求
// 最简单的形式
axios.get('/api/user')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('请求出错:', error);
  });

// 带参数的 GET 请求
axios.get('/api/user', {
    params: {
      ID: 12345
    }
  })
  .then(response => {
    console.log(response.data);
  });

3. POST 请求
// 发送 JSON 数据
axios.post('/api/user', {
    firstName: '张',
    lastName: '三',
    age: 30
  })
  .then(response => {
    console.log(response.data);
  });

// 发送表单数据 (application/x-www-form-urlencoded)
const params = new URLSearchParams();
params.append('name', '李四');
params.append('age', '25');
axios.post('/api/user', params);

4. 并发请求
// 同时发起多个请求
function getUserAccount() {
  return axios.get('/api/user/123');
}

function getUserPermissions() {
  return axios.get('/api/user/123/permissions');
}

Promise.all([getUserAccount(), getUserPermissions()])
  .then(results => {
    const account = results[0].data;
    const permissions = results[1].data;
    console.log(account, permissions);
  });

5. 文件上传
// 通过 FormData 上传文件
const formData = new FormData();
const file = document.querySelector('input[type="file"]').files[0];
formData.append('file', file);

axios.post('/api/upload', formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: progressEvent => {
      const percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      console.log(`${percentCompleted}%`);
    }
  })
  .then(response => {
    console.log('上传成功:', response.data);
  });

6. 自定义配置
// 创建自定义实例
const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

// 使用实例
instance.get('/user')
  .then(response => {
    console.log(response.data);
  });

7. 请求和响应拦截器
// 添加请求拦截器
axios.interceptors.request.use(config => {
  // 在发送请求前做些什么
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(response => {
  // 对响应数据做点什么
  return response.data; // 直接返回data部分
}, error => {
  // 对响应错误做点什么
  if (error.response.status === 401) {
    // 处理未授权情况
    window.location.href = '/login';
  }
  return Promise.reject(error);
});

8. 错误处理
axios.get('/api/user/123')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    if (error.response) {
      // 请求已发出,服务器返回状态码不在 2xx 范围内
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.log(error.request);
    } else {
      // 设置请求时发生错误
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

9. 取消请求
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/api/user/123', {
  cancelToken: source.token
}).catch(thrown => {
  if (axios.isCancel(thrown)) {
    console.log('请求已取消:', thrown.message);
  } else {
    // 处理其他错误
  }
});
// 取消请求
source.cancel('用户取消了请求');

10. 全局配置
// 设置全局默认值
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';

11. 使用 async/await
async function getUser() {
  try {
    const response = await axios.get('/api/user/123');
    console.log(response.data);
  } catch (error) {
    console.error('获取用户失败:', error);
  }
}
// 并发请求
async function getData() {
  try {
    const [user, orders] = await Promise.all([
      axios.get('/api/user/123'),
      axios.get('/api/orders?user=123')
    ]);
    console.log(user.data, orders.data);
  } catch (error) {
    console.error('获取数据失败:', error);
  }
}