Axios的核心理解 | 青训营

86 阅读4分钟

Axios 是什么?

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

说人话就是让我们方便的发起ajax请求

为什么要用axios?

想必大家写过这样类似的代码

    fetch(
          "xxxx",
            {
                method:"xxx",
                headers:{
                    "Content-Type":"xxxxxxxxxxxxxxxxx",
                    "Authorization":"xxxxxxxxxxxxxxxx"
                },  
                body:`xxxxxxxxxx`
            }
        )

虽然相比XMLHttpRequest,fetch已经极大的简化了发起请求的代码

但是想headers里面的字段会经常变吗?

但是你不得每次发起请求的时候都重新带上这这些一模一样的字段。

当你想每次请求后,都检查一下状态码,获取请求前做一些判断是否登录的逻辑,你不得不重新写一边,聪明的你可能会cv,但是也是太过于麻烦。

作为一个能偷懒就偷懒的程序员会答应吗?不答应!

所以axios就是一个封装了网络请求的库,帮助我们更加优雅的写发起请求(偷懒);

安装

由于我们还没有学习npm和模块系统,采用cdn引入的方式使用axios

<script src="[https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js](https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js)"></script>



浏览器中使用Axios

请求配置

就像平时我们在fetch里面配置url和各种请求头音乐,axios也接受一个配置对象。官网

{
  url: '/user',
  method: 'get', // 默认值
  baseURL: 'https://some-domain.com/api/',
  transformRequest: [function (data, headers) {
    return data;
  }],
  transformResponse: [function (data) {
    return data;
  }],
  headers: {'X-Requested-With': 'XMLHttpRequest'},
  params: {
    ID: 12345
  },
  paramsSerializer: function (params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },
  data: {
    firstName: 'Fred'
  },
  data: 'Country=Brasil&City=Belo Horizonte',
  timeout: 1000, // 默认值是 `0` (永不超时)
  withCredentials: false, // default
  adapter: function (config) {
    /* ... */
  },
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },
  responseType: 'json', // 默认值
  responseEncoding: 'utf8', // 默认值
  xsrfCookieName: 'XSRF-TOKEN', // 默认值
  xsrfHeaderName: 'X-XSRF-TOKEN', // 默认值
  onUploadProgress: function (progressEvent) {
    // 处理原生进度事件
  },
  onDownloadProgress: function (progressEvent) {
    // 处理原生进度事件
  },
  maxContentLength: 2000,
  maxBodyLength: 2000,
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认值
  },
  maxRedirects: 5, // 默认值
  socketPath: null, // default
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),
  proxy: {
    protocol: 'https',
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  cancelToken: new CancelToken(function (cancel) {
  }),
  decompress: true // 默认值

}

是不是人都看麻了,我也是。

我们不必每个配置都记得清清楚楚,要用的时候就查就好。

介绍几个常用的

  1. url它有两种写法,一种是绝对地址像这种runninglili.club:8080/getAllMessa…

  2. headers和原生的写法一致

  3. timeout设置等待时长,如果超过此时间就会终止

  4. data相当于原生的body配置项,默认将JavaScript 对象序列化为 JSON发送

  5. baseUrl设置后端的基础地址

  6. params 设置params参数

  7. 响应体编码

默认情况axios将 响应头序列化为 JSON

也就是免写.then(res=>res.json())这种常见情况的编码

也可以选择其他编码格式,等下细🔒

  1. 响应体结构

axios对响应体进行了封装,方便我们更加复杂的代码逻辑

{
  // `data` 由服务器提供的响应
  data: {},

  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,

  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',

  // `headers` 是服务器响应头
  // 所有的 header 名称都是小写,而且可以使用方括号语法访问
  // 例如: `response.headers['content-type']`
  headers: {},

  // `config``axios` 请求的配置信息
  config: {},

  // `request` 是生成此响应的请求
  // 在node.js中它是最后一个ClientRequest实例 (in redirects),
  // 在浏览器中则是 XMLHttpRequest 实例
  request: {}
}

通过Axios实例来配置一些默认情况,简化我们的工作

//先新建一个axios实例
const instance = axios.create({
  baseURL: 'http://runninglili.club:8080',
  headers: {
    'Authorization': 'xxxxx',
    "Content-Type":"application/x-www-form-urlencoded"
  }
});
//之后我们就可以基于实例请求
instance.get("/getAllMessages")
    .then(res=>{
        const html=res.data.map(item=>
        `<li>
             <section class="imf">
                <div>${item.username}</div>
                <img src="${item.avatar}" alt="">
            </section>
            <h3 class="mes">${item.words}</h3>
        </li>`
        ).join("")
        document.querySelector(".chatUl").insertAdjacentHTML("beforeend",html)
    });

拦截器


  const instance = axios.create({ baseURL: 'http://localhost:8080',});
  instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    alert(err);
    return Promise.reject(error);
  });
  //我们不必再对接下来的请求做错误处理,axios会自动帮我们调用
  instance.get("/getAllMessge")
  instance.post("/login",{...})