基于 promise 的 HTTP 库

用于测试请求模拟接口,RESTful 架构的 API,会根据不同的请求方法在同一个 URL 返回不同的资源。

基本使用

GET 请求

  1. axios({
  2. method: 'get',
  3. url: 'https://jsonplaceholder.typicode.com/todos'
  4. })
  5. .then(res => {
  6. console.log(res);
  7. })
  8. .catch(err => {
  9. console.log(err);
  10. })

传入参数

  1. 直接在 URL 加入参数
  2. options 使用 params 属性
    1. axios({
    2. method: 'get',
    3. url'https://jsonplaceholder.typicode.com/todos?_limit=5',
    4. // 或
    5. url: 'https://jsonplaceholder.typicode.com/todos',
    6. params: {
    7. _limit: 5
    8. }
    9. })
    10. .then(res => {
    11. console.log(res);
    12. })
    13. .catch(err => {
    14. console.log(err);
    15. })

使用 axios 静态方法 get

  1. axios.get('https://jsonplaceholder.typicode.com/todos?_limit=5')
  2. .then(res => {
  3. console.log(res);
  4. })
  5. .catch(err => {
  6. console.log(err);
  7. })

POST 请求

  1. axios({
  2. method: 'post',
  3. url: 'https://jsonplaceholder.typicode.com/todos',
  4. data: {
  5. title: 'JS++',
  6. completed: false,
  7. }
  8. })
  9. .then(res => {
  10. console.log(res);
  11. })
  12. .catch(err => {
  13. console.log(err);
  14. })

使用 axios 静态方法 post

  1. axios.post(
  2. 'https://jsonplaceholder.typicode.com/todos',
  3. {
  4. title: 'JS++',
  5. completed: false,
  6. }
  7. )
  8. .then(res => {
  9. console.log(res);
  10. })
  11. .catch(err => {
  12. console.log(err);
  13. })

PUT / PATCH 请求

在 RESTful 中 PUT 是整条记录全部更新(替换为新的记录),PATCH 只是更新记录中的某些 fields

  1. axios.put(
  2. 'https://jsonplaceholder.typicode.com/todos/1',
  3. {
  4. title: 'JS++',
  5. completed: true,
  6. }
  7. )
  8. .then(res => {
  9. console.log(res);
  10. })
  11. .catch(err => {
  12. console.log(err);
  13. })
  14. axios.patch(
  15. 'https://jsonplaceholder.typicode.com/todos/1',
  16. {
  17. title: 'JS++',
  18. completed: true,
  19. }
  20. )
  21. .then(res => {
  22. console.log(res);
  23. })
  24. .catch(err => {
  25. console.log(err);
  26. })

DELETE 请求

  1. axios.delete(
  2. 'https://jsonplaceholder.typicode.com/todos/1',
  3. )
  4. .then(res => {
  5. console.log(res);
  6. })
  7. .catch(err => {
  8. console.log(err);
  9. })

批量请求

axios.all

  1. axios.all([
  2. axios.get('https://jsonplaceholder.typicode.com/todos'),
  3. axios.get('https://jsonplaceholder.typicode.com/posts'),
  4. ])
  5. .then(res=>{
  6. console.log(res[0]);
  7. console.log(res[1]);
  8. })
  9. .catch(err => {
  10. console.log(err);
  11. });

axios.spread 把结果更优雅地分开

  1. axios
  2. .all([
  3. axios.get("https://jsonplaceholder.typicode.com/todos"),
  4. axios.get("https://jsonplaceholder.typicode.com/posts"),
  5. ])
  6. .then(
  7. axios.spread((todos, posts) => {
  8. console.log(todos);
  9. console.log(posts);
  10. })
  11. )
  12. .catch((err) => {
  13. console.log(err);
  14. });

请求拦截和响应拦截

axios.interceptors

  1. axios.interceptors.request.use(config => {
  2. console.log(`${config.method.toUpperCase()} request sent to ${config.url}` at ${new Date().getTime()});
  3. }, error => {
  4. return Promise.reject(error);
  5. })

自定义请求头

可以用于配合 JWT JSON Web Tokens

  1. const config = {
  2. header: {
  3. 'Content-Type': 'application/json',.
  4. Authorization: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
  5. }
  6. }
  7. axios.post(
  8. 'https://jsonplaceholder.typicode.com/todos',
  9. {
  10. title: 'JS++',
  11. completed: false,
  12. },
  13. config
  14. )
  15. .then(res => {
  16. console.log(res);
  17. })
  18. .catch(err => {
  19. console.log(err);
  20. })

转换请求数据和响应数据

options.transformRequest
options.transformResponse

  1. const options = {
  2. method: 'post',
  3. url: 'https://jsonplaceholder.typicode.com/todos',
  4. data: {
  5. title: 'Hello World',
  6. completed: false,
  7. },
  8. transformResponse: axios.defaults.transformResponse.concat(res => {
  9. const data = res.data;
  10. data.title = data.titletoUpperCase();
  11. return data;
  12. })
  13. }
  14. axios(options);

全局配置

通过修改 defaults

  1. axios.defaults.headers.common['Authorization'] = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';

异常处理

  1. axios({
  2. method: 'get',
  3. url: 'https://jsonplaceholder.typicode.com/error' // 不存在的 URL
  4. })
  5. .then(res => {
  6. console.log(res);
  7. })
  8. .catch(err => {
  9. if(err.response){
  10. console.log(err.response.data); // 服务端返回数据
  11. console.log(err.response.status); // 状态码
  12. console.log(err.response.headers); // 响应头部
  13. if(err.response.status === 404){
  14. // 响应 404 的页面
  15. } else if (err.requset){
  16. console.error(err.request); // 没有返回响应
  17. } else {
  18. console.error(err.message);
  19. }
  20. }
  21. })

取消请求

可以使用 CancelToken.source 工厂方法创建 cancel token

  1. const source = axios.CancelToken.source();
  2. axios({
  3. method: 'get',
  4. url: 'https://jsonplaceholder.typicode.com/todos',
  5. cancelToken: source.token
  6. })
  7. .then(res => {
  8. console.log(res);
  9. })
  10. .catch(thrown => {
  11. if(axios.isCancel(thrown)){
  12. console.log('Some message:', thrown.message);
  13. }
  14. })
  15. if(true){
  16. source.cancel('Reqauest Canceled');
  17. }

axios 实例

  1. const axiosInstance = axios.create({
  2. baseURL: 'https://jsonplaceholder.typicode.com/'
  3. })
  4. axiosInstance.get('/post').then(res => console.log(res));

config 配置

timeout 超时 单位 ms
validateStatus 验证状态码,通过就不会被 catch

  1. {
  2. validateStatus: function(status){
  3. return status < 500
  4. }
  5. }