为了账号安全,请及时绑定邮箱和手机立即绑定

Fetch / Axios项目实战:新手指南

概述

本文详细介绍了Fetch和Axios两个库的使用方法,并通过实战项目演示了如何使用它们进行网络请求。文章涵盖了Fetch与Axios的基础使用、GET和POST请求的发送,以及如何处理响应数据。通过实际操作,读者可以深入了解Fetch / Axios项目实战的全过程。

Fetch与Axios简介
Fetch API简介

Fetch API 是浏览器内置的标准接口,用于发起网络请求。它返回一个 Promise 对象,可以处理异步请求的结果。Fetch API 提供了更强大的功能,如请求和响应的流式处理。Fetch API 支持 HTTP 协议,可以与服务端进行数据交换。

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
Axios简介

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它支持拦截请求和响应、转换请求和响应数据、自动转换 JSON 数据、处理浏览器和 Node.js 的 CORS 问题。Axios 是一个广泛使用的库,因为它具有良好的跨平台支持和易于使用的 API。

axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
Fetch与Axios的区别和联系
  • 区别

    • Fetch API 是浏览器内置,而 Axios 是第三方库。
    • Fetch API 使用 Promise,Axios 也使用 Promise,但 Axios 的 API 设计更直观。
    • Fetch API 不支持浏览器的自动 JSON 转换,而 Axios 会自动解析 JSON 数据。
    • Axios 提供了更丰富的功能,如请求和响应拦截、取消请求等。
  • 联系
    • 两者都可以发起 GET 和 POST 请求。
    • 都可以处理响应和错误。
环境搭建
创建项目

创建一个新的项目目录,并初始化一个新的 Node.js 项目。

mkdir my-project
cd my-project
npm init -y

初始化完成后,可以通过 cat package.json 查看生成的 package.json 文件内容。

cat package.json
安装Axios

使用 npm 安装 Axios。

npm install axios

安装完成后,可以通过以下代码验证 Axios 是否安装成功:

const axios = require('axios');
console.log('Axios is installed and working');
Fetch基础使用
GET请求

Fetch API 可以通过 fetch 函数发起 GET 请求。fetch 函数返回一个 Promise,解析响应时可以调用 .then 方法。

fetch('https://api.example.com/data')
  .then(response => {
    if (response.ok) {
      return response.json();
    } else {
      throw new Error('Network response was not ok');
    }
  })
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
POST请求

Fetch API 发送 POST 请求需要设置请求体,可以通过设置 body 参数来实现。JSON.stringify 用于将 JavaScript 对象转换为 JSON 字符串。

const data = {
  name: 'John Doe',
  age: 30
};

fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
})
  .then(response => {
    if (response.ok) {
      return response.json();
    } else {
      throw new Error('Network response was not ok');
    }
  })
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
处理响应

Fetch API 返回的响应对象 Response 可以通过 .json() 方法来解析 JSON 数据。.json() 返回一个 Promise,解析成功后可以获取到解析后的数据。

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    // 处理数据
  })
  .catch(error => console.error('Error:', error));
Axios基础使用
GET请求

Axios 发送 GET 请求非常简单,使用 axios.get 方法即可。axios.get 返回一个 Promise,可以通过 .then 方法处理响应数据。

axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
POST请求

Axios 发送 POST 请求也需要设置请求体,可以通过 axios.post 方法来实现。Axios 自动解析 JSON 数据,无需手动转换。

const data = {
  name: 'John Doe',
  age: 30
};

axios.post('https://api.example.com/data', data)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
处理响应

Axios 发送的请求返回的数据可以通过 .then 方法处理,响应对象 response 包含 datastatusstatusTextheadersconfig 等属性。

axios.post('https://api.example.com/data', data)
  .then(response => {
    console.log(response.data);
    // 处理数据
  })
  .catch(error => {
    console.error('Error:', error);
  });
实战演练:使用Fetch/Axios与API交互
选择API

为了演示数据交互,我们选择了一个公开的 API:JSONPlaceholder。它提供了一些示例的 REST API,可以用来测试各种 HTTP 请求。

https://jsonplaceholder.typicode.com
发送GET请求获取数据

使用Fetch

使用 Fetch API 发送 GET 请求来获取用户列表。

fetch('https://jsonplaceholder.typicode.com/users')
  .then(response => response.json())
  .then(users => {
    console.log(users);
  })
  .catch(error => console.error('Error:', error));

使用Axios

使用 Axios 发送 GET 请求来获取用户列表。

axios.get('https://jsonplaceholder.typicode.com/users')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
发送POST请求提交数据

使用Fetch

使用 Fetch API 发送 POST 请求来提交数据,这里我们提交一个用户。

const userData = {
  name: 'Jane Doe',
  username: 'johndoe',
  email: 'jane.doe@example.com',
  address: {
    street: '123 Main St',
    suite: 'Apt 12',
    city: 'Anytown',
    zipcode: '12345'
  },
  phone: '123-456-7890',
  website: 'johndoe.com',
  company: {
    name: 'ACME Corp',
    catchPhrase: 'Innovating since 1999',
    bs: 'world-class solutions'
  }
};

fetch('https://jsonplaceholder.typicode.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(userData)
})
  .then(response => response.json())
  .then(data => {
    console.log(data);
  })
  .catch(error => console.error('Error:', error));

使用Axios

使用 Axios 发送 POST 请求来提交数据,这里我们提交一个用户。

const userData = {
  name: 'Jane Doe',
  username: 'johndoe',
  email: 'jane.doe@example.com',
  address: {
    street: '123 Main St',
    suite: 'Apt 12',
    city: 'Anytown',
    zipcode: '12345'
  },
  phone: '123-456-7890',
  website: 'johndoe.com',
  company: {
    name: 'ACME Corp',
    catchPhrase: 'Innovating since 1999',
    bs: 'world-class solutions'
  }
};

axios.post('https://jsonplaceholder.typicode.com/users', userData)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
常见问题与解决方案
网络请求失败
  • 问题:请求网络失败,出现 Network Error
  • 解决方法:检查网络连接,确保目标 URL 是正确的。
  • 示例代码
axios.get('https://example.invalid')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
CORS 错误
  • 问题:请求时出现 Access to XMLHttpRequest at '...' from origin '...' has been blocked by CORS policy
  • 解决方法:检查目标服务器是否允许跨域请求。如果服务器不支持 CORS,请使用代理服务器。
  • 示例代码
axios.get('https://api.example.com/data', {
  headers: {
    'Access-Control-Allow-Origin': '*'
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });
JSON 解析错误
  • 问题:请求返回的数据不是 JSON 格式,解析时出现错误。
  • 解决方法:检查返回的数据格式,确保服务器返回的是 JSON 格式的数据。
  • 示例代码
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.log(data);
  })
  .catch(error => console.error('Error:', error));
提高代码可读性和可维护性的技巧

抽取公共代码

将公共代码抽取到一个单独的函数中,避免重复代码。

const fetchJson = async (url) => {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json();
};

fetchJson('https://api.example.com/data')
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

使用错误处理

在代码中添加适当的错误处理,确保错误可以被捕获和处理。

axios.post('https://jsonplaceholder.typicode.com/users', userData)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
    if (error.response) {
      console.error('Status:', error.response.status);
      console.error('Data:', error.response.data);
      console.error('Headers:', error.response.headers);
    } else if (error.request) {
      console.error('No response received');
    } else {
      console.error('Something went wrong', error.message);
    }
  });

使用配置对象

使用配置对象来设置请求参数,使得代码更清晰和可维护。

const config = {
  headers: {
    'Content-Type': 'application/json'
  },
  timeout: 10000
};

axios.post('https://jsonplaceholder.typicode.com/users', userData, config)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

使用接口定义

定义一个接口来描述请求和响应的数据结构,可以提高代码的可读性和可维护性。

interface User {
  id: number;
  name: string;
  username: string;
  email: string;
  address: {
    street: string;
    suite: string;
    city: string;
    zipcode: string;
  };
  phone: string;
  website: string;
  company: {
    name: string;
    catchPhrase: string;
    bs: string;
  };
}

axios.post<User>('https://jsonplaceholder.typicode.com/users', userData)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

通过以上示例和技巧,你可以更有效地使用 Fetch 和 Axios 进行网络请求,提高代码的质量和可维护性。如果你需要更深入地了解或学习更多内容,可以参考慕课网(https://www.imooc.com/)提供的教程

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消