Vue axios详解
发布日期:2021-05-07 07:13:28 浏览次数:26 分类:原创文章

本文共 7458 字,大约阅读时间需要 24 分钟。

文章目录

一、axios 定义

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中

二、axios 特性

axios 的优势:

  • 从浏览器中创建
  • 从 node.js 创建 请求
  • 支持 API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 CSRF

三、安装和使用

  • 指令安装:npm i --S axios
  • 直接引用:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

四、请求写法

执行 GET 请求:

// 为给定 ID 的 user 创建请求axios.get('/user?ID=12345')  .then(function (response) {   // 请求成功    console.log(response);  })  .catch(function (error) {   // 请求失败    console.log(error);  });// 上面的请求也可以这样做axios.get('/user', {       params: {         ID: 12345    }  })  .then(function (response) {   // 请求成功    console.log(response);  })  .catch(function (error) {   // 请求失败    console.log(error);  });

执行 POST 请求:

axios.post('/user', {       firstName: 'Fred',    lastName: 'Flintstone'  })  .then(function (response) {       console.log(response);  })  .catch(function (error) {       console.log(error);  });

执行多个并发请求:

  • 异步请求的同步化,必须两个请求都执行完才会返回结果,如果中间某个请求失败,则中断
  • axios.all(iterable)
  • axios.spread(callback)
//获得用户信息的请求function getUserAccount() {     return axios.get('/user/12345');}//获取用户许可证的请求function getUserPermissions() {     return axios.get('/user/12345/permissions');}axios.all([getUserAccount(), getUserPermissions()])  .then(axios.spread(function (acct, perms) {       // 两个请求现在都执行完成  })).catch(function (error) {       console.log(error);  });

注意:axios.all方法接受一个数组作为参数,数组中的每个元素都是一个请求,返回一个promise对象,当数组中所有请求均已完成时,执行then方法。
在then方法中执行了 axios.spread 方法。该方法是接收一个函数作为参数,返回一个新的函数。接收的参数函数的参数是axios.all方法中每个请求返回的响应。

注意:axios.all 缺点,所有的请求都成功的情况下再返回一个结果;如果有一个失败了,就会走 catch error的分支,请求中断

五、axios API

  • 可以通过向 axios 传递相关配置来创建请求
  • axios(config)
// 发送 POST 请求axios({     method: 'post',  url: '/user/12345',  data: {       firstName: 'Fred',    lastName: 'Flintstone'  }});
// 获取远端图片axios({     method:'get',  url:'http://bit.ly/2mTM3nY',  responseType:'stream'})  .then(function(response) {     response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))});
  • axios(url[, config])
// 发送 GET 请求(默认的方法)axios('/user/12345');

六、创建实例

  • 可以使用自定义配置新建一个 axios 实例
  • axios.create([config])
const instance = axios.create({     baseURL: 'https://some-domain.com/api/',  timeout: 1000,	  headers: {   'X-Custom-Header': 'foobar'}});

实例方法

  • 以下是可用的实例方法。指定的配置将与实例的配置合并。

  • axios#request(config)

  • axios#get(url[, config])

  • axios#delete(url[, config])

  • axios#head(url[, config])

  • axios#options(url[, config])

  • axios#post(url[, data[, config]])

  • axios#put(url[, data[, config]])

  • axios#patch(url[, data[, config]])

七、请求配置

  • config为axios的各种配置
  • 常用配置如:
{      // `url` 是用于请求的服务器 URL  url: '/user',  // `method` 是创建请求时使用的方法  method: 'get', // default  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL  baseURL: 'https://some-domain.com/api/',  // `headers` 是即将被发送的自定义请求头,header中可以配置Authorization 传递 token  headers: {   'X-Requested-With': 'XMLHttpRequest'},  // `params` 是即将与请求一起发送的 URL 参数,一般链接在URL后面    // 必须是一个无格式对象(plain object)或 URLSearchParams 对象  params: {       ID: 12345  },  // `data` 是作为请求主体被发送的数据  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'  // 在没有设置 `transformRequest` 时,必须是以下类型之一:  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams  // - 浏览器专属:FormData, File, Blob  // - Node 专属: Stream  data: {       firstName: 'Fred'  },  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)  // 如果请求话费了超过 `timeout` 的时间,请求将被中断  timeout: 1000,   // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'  responseType: 'json', // default  }
  • 其他一些不常用的配置:
{     // `transformRequest` 允许在向服务器发送前,修改请求数据  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法  // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream  transformRequest: [function (data, headers) {       // 对 data 进行任意转换处理    return data;  }],  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据  transformResponse: [function (data) {       // 对 data 进行任意转换处理    return data;  }],    // `paramsSerializer` 是一个负责 `params` 序列化的函数  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)  paramsSerializer: function(params) {       return Qs.stringify(params, {   arrayFormat: 'brackets'})  },    // `withCredentials` 表示跨域请求时是否需要使用凭证  withCredentials: false, // default  // `adapter` 允许自定义处理请求,以使测试更轻松  // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).  adapter: function (config) {       /* ... */  },  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据  // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头  auth: {       username: 'janedoe',    password: 's00pers3cret'  },    // `responseEncoding` 指定用于解码响应的编码  // 注意:对于'stream'的' responseType '或客户端请求将被忽略  responseEncoding: 'utf8', // default   // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称  xsrfCookieName: 'XSRF-TOKEN', // default  // ' xsrfHeaderName '是携带xsrf令牌值的http报头的名称  xsrfHeaderName: 'X-XSRF-TOKEN', // default   // `onUploadProgress` 允许为上传处理进度事件  onUploadProgress: function (progressEvent) {       // 对本机进度事件执行您想要的任何操作  },  // `onDownloadProgress` 允许为下载处理进度事件  onDownloadProgress: function (progressEvent) {       // 对原生进度事件的处理  },   // `maxContentLength` 定义允许的响应内容的最大尺寸  maxContentLength: 2000,  // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte  validateStatus: function (status) {       return status >= 200 && status < 300; // default  },  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目  // 如果设置为0,将不会 follow 任何重定向  maxRedirects: 5, // default  // `socketPath` 定义在node.js中使用的UNIX套接字  // 例如: '/var/run/docker.sock' 向docker守护进程发送请求  // 只能指定' socketPath '或' proxy '  // 如果两者都指定了, 使用`socketPath`   socketPath: null, // default  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:  // `keepAlive` 默认没有启用  httpAgent: new http.Agent({    keepAlive: true }),  httpsAgent: new https.Agent({    keepAlive: true }),  // 'proxy' 定义代理服务器的主机名称和端口  // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据  // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。  proxy: {       host: '127.0.0.1',    port: 9000,    auth: {         username: 'mikeymike',      password: 'rapunz3l'    }  },  // `cancelToken` 指定用于取消请求的 cancel token  cancelToken: new CancelToken(function (cancel) {     })}

八、响应结构

{     // `data` 由服务器提供的响应  data: {   },  // `status` 来自服务器响应的 HTTP 状态码  status: 200,  // `statusText` 来自服务器响应的 HTTP 状态信息  statusText: 'OK',  // `headers` 服务器响应的头  headers: {   },   // `config` 是为请求提供的配置信息  config: {   },  // ' request '是生成此响应的请求  // 它是node.js中的最后一个ClientRequest实例(在重定向中)  // 以及浏览器的XMLHttpRequest实例  request: {   }}

九、配置默认值

你可以指定将被用在各个请求的配置默认值

全局的 axios 默认值

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';

自定义实例默认值

// 在创建实例时设置config defaultsconst instance = axios.create({     baseURL: 'https://api.example.com'});// 在创建实例之后更改默认值instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

十、拦截器

  • 在请求或响应被 thencatch 处理前拦截它们。
// 添加请求拦截器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 实例添加拦截器
const instance = axios.create();instance.interceptors.request.use(function () {   /*...*/});
上一篇:深入理解计算机系统阅读笔记CSAPP(1)计算机系统漫游,程序的执行过程,
下一篇:Vue 生命周期和钩子函数

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月25日 14时35分03秒