axios-日常使用篇

强烈建议使用具体命方法发送请求

发送get

axios.get('/user?ID=12345')

或着

axios.get('/user', {
    params: {
      ID: 12345
    }
  })

axios#get(url[, config])(查),delete(删)与其形式一样

发送post

axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })

axios#post(url[, data[, config]])(改) ,put(增) 与其形式一样
相比于

axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

不仅代码简洁,可读性野好。
根据 Content-Type 的类型,data可以不是普通对象

application/json

默认


image.png

application/x-www-form-urlencoded

普通表单提交

axios.post("/test/test/test2", qs.stringify({ bar: 123 }));

multipart/form-data

可以用于上传文件

    const params = new FormData();
    params.append("param1", "value1");
    params.append("param2", "value2");
    axios.post("/test/test/test2", params);

image.png

四种常见的 POST 提交数据方式
可以不指定,axios会自动判断

其实axiosPromise 的一种实现

console.log(axios.post("/test/test/test1"));
image.png

解决多个请求

 axios
      .all([
        new Promise((resolve, reject) => {
          resolve("success1");
        }),
        new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve("success2");
          }, 2000);
        }),
      ])
      .then(
        axios.spread((res1, res2) => {
          console.log(res1, res2);
        }),
      );

axios.all 请求都成功才算成功,有一个失败则失败,要和axios.spread 搭配使用

您有没有好奇,为啥没有Promiserace 方法

其实上述代码可以替换为:

    Promise.all([
      axios.post("/test/test/test2"),
      axios.post("/test/test/test1"),
    ]).then((r1, r2) => {
      console.log("res", r1, r2);
    });

同理race 可写为:

    Promise.race([
      axios.post("/test/test/test2"),
      axios.post("/test/test/test1"),
    ]).then((r1) => {
      console.log("res", r1);
    });

请求可以被取消

一些搜索不取消上一次的请求,响应时间大于用户做出其他操作的时间,可能看到一些奇怪的行为

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');

axios配置概要

axios被设计成可以在nodejs中使用,官网上有些配置是只适用于nodejs

baseURL

公共前缀,用于生成最终的url

responseType

定义响应的数据类型 默认json,可以是arraybuffer, document, json, text, stream

onUploadProgress

得到上传进度

 onUploadProgress: function (progressEvent) {
 
  },

onDownloadProgress

得到下载进度

  onDownloadProgress: function (progressEvent) {

  }

transformRequest

自己处理发送的数据

    axios.post(
      "/test/test/test1",
      {
        content: "武汉加油!"
      },
      {
        headers: {
          "content-type": "application/json"
        },
        transformRequest: (data, headers) => {
          return JSON.stringify(data);
        }
      }

content-type 大小写不敏感

data 属性

发送的数据,最终发送的都是字符串,只是格式以及对应的解析方式不同
当没定义transformRequest 只能是FormData, File, Blob,string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams

headers

用于设置Request Headers,默认值{'X-Requested-With': 'XMLHttpRequest'}
x-requested-with 为 null,则为传统同步请求,为 XMLHttpRequest,则为 Ajax 异步请求。
x-requested-with的作用以及用法详解

timeout

相应超时时间,默认是0,不限制

withCredentials

默认false,跨域请求时是否携带Cookie,请求图片时不携带增加成功率,而登录时不携带则无法成功

validateStatus

返回状态码是多少时表示成功

  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },

paramsSerializer

自定义序列化参数的方式

    axios.get(
      "/test/test/test1",

      {
        params: {
          content: "武汉加油!"
        },
        paramsSerializer: function(params) {
          return qs.stringify(params, { arrayFormat: "brackets" });
        }
      }

adapter

用于模拟响应

    axios
      .post(
        "/test/test/test1",
        {
          content: "武汉加油"
        },
        {
          adapter: function(config) {
            return new Promise((res, rej) => {
              const resInfo = {
                data: {
                  content: "必需的"
                },
                status: 200,
                statusText: "OK"
              };

              // 调用响应函数
              res(resInfo);
            });
          }
        }
      )
      .then(res => {
        console.log(res);
      });

这时便不会发送请求
config 是这个样子的


image.png

auth

Request Headers中会多出Authorization

    axios
      .post(
        "/test/test/test1",
        {
          content: "武汉加油"
        },
        {}
      )

修改配置

config 里面的属性都可以通过axios.defaults方式修改

axios.defaults.baseURL = 'https://api.example.com';

所有请求的Authorization默认值


axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

只对应post请求


axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

只有headers支持common和指定类型的设置

可以通过创建实例的方式指定配置

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

可以配置拦截器

请求时拦截

axios.interceptors.request.use(function (config) {
    // 请求发送前
    return config;
  }, function (error) {
   //发送时出现了错误
    return Promise.reject(error);
  });


在响应时拦截

axios.interceptors.response.use(function (response) {
    //正常响应
    return response;
  }, function (error) {
    //错误响应
    return Promise.reject(error);
  });

温馨提示,当代码逻辑与预期不符时,可以按照当前请求=>实例=>默认配置进行排查,以及排查拦截器的逻辑

下列拦截器逻辑可导致axios.all有请求失败也会走then方法,

axios.interceptors.response.use(
  function(response) {
    return response;
  },
  (error, response) => {
    if (error.response && error.response.status === 504) {
     
    } else {
      console.error(error);
    }
  }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在...
    Yanghc阅读 3,587评论 0 7
  • 一、安装 1、 利用npm安装npm install axios --save 2、 利用bower安装bower...
    kiddings阅读 1,710评论 0 3
  • axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在...
    jslxm阅读 4,076评论 0 1
  • axios的基本使用 安装axios,因为运行时也要用到所以是--savenpm install axios --...
    反复练习的阿离很笨吧阅读 380评论 0 0
  • axios插件的使用操作 axios插件的使用操作 axios [图片上传失败...(image-744a97-1...
    魔仙堡杠把子灬阅读 2,995评论 0 1