VueJs 搭建Axios接口请求工具


Posted in Javascript onNovember 20, 2017

axios 简介

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

  1. 从浏览器中创建 XMLHttpRequest
  2. 从 node.js 发出 http 请求
  3. 支持 Promise API
  4. 拦截请求和响应
  5. 转换请求和响应数据
  6. 取消请求
  7. 自动转换JSON数据
  8. 客户端支持防止 CSRF/XSRF

上一章,我们认识了项目的目录结构,以及对项目的目录结构做了一些调整,已经能把项目重新跑起来了。今天我们来搭建api接口调用工具Axios。Vue本身是不支持ajax调用的,如果你需要这些功能就需要安装对应的工具。

支持ajax请求的工具很多,像superagent和axios。今天我们用的就是axios,因为听说最近网上大部分的教程书籍都使用的是axios,本身axios这个工具就已经做了很好的优化和封装,但是在使用时,还是比较繁琐,所以我们来重新封装一下。

安装Axios工具

VueJs 搭建Axios接口请求工具

cnpm install axios -D 

在安装的时候,一定要切换进入咱们的项目根目录,再运行安装命令,然后如提示以上信息,则表示安装完成。

封装Axios工具

编辑src/api/index.js文件(我们在上一章整理目录结构时,在src/api/目录新建了一个空的index.js文件),现在我们为该文件填写内容。

// 配置API接口地址
var root = 'https://cnodejs.org/api/v1'
// 引用axios
var axios = require('axios')
// 自定义判断元素类型JS
function toType (obj) {
 return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
// 参数过滤函数
function filterNull (o) {
 for (var key in o) {
  if (o[key] === null) {
   delete o[key]
  }
  if (toType(o[key]) === 'string') {
   o[key] = o[key].trim()
  } else if (toType(o[key]) === 'object') {
   o[key] = filterNull(o[key])
  } else if (toType(o[key]) === 'array') {
   o[key] = filterNull(o[key])
  }
 }
 return o
}
/*
 接口处理函数
 这个函数每个项目都是不一样的,我现在调整的是适用于
 https://cnodejs.org/api/v1 的接口,如果是其他接口
 需要根据接口的参数进行调整。参考说明文档地址:
 https://cnodejs.org/topic/5378720ed6e2d16149fa16bd
 主要是,不同的接口的成功标识和失败提示是不一致的。
 另外,不同的项目的处理方法也是不一致的,这里出错就是简单的alert
*/
function apiAxios (method, url, params, success, failure) {
 if (params) {
  params = filterNull(params)
 }
 axios({
  method: method,
  url: url,
  data: method === 'POST' || method === 'PUT' ? params : null,
  params: method === 'GET' || method === 'DELETE' ? params : null,
  baseURL: root,
  withCredentials: false
 })
 .then(function (res) {
 if (res.data.success === true) {
  if (success) {
   success(res.data)
  }
 } else {
  if (failure) {
   failure(res.data)
  } else {
   window.alert('error: ' + JSON.stringify(res.data))
  }
 }
 })
 .catch(function (err) {
  let res = err.response
  if (err) {
   window.alert('api error, HTTP CODE: ' + res.status)
  }
 })
}
// 返回在vue模板中的调用接口
export default {
 get: function (url, params, success, failure) {
  return apiAxios('GET', url, params, success, failure)
 },
 post: function (url, params, success, failure) {
  return apiAxios('POST', url, params, success, failure)
 },
 put: function (url, params, success, failure) {
  return apiAxios('PUT', url, params, success, failure)
 },
 delete: function (url, params, success, failure) {
  return apiAxios('DELETE', url, params, success, failure)
 }
}

更多关于AxIos的解释请参见:https://github.com/mzabriskie/axios

配置Axios工具

我们在使用之前,需要在src/main.js中进行简单的配置,先来看一下原始的main.js文件

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
/* eslint-disable no-new */
 new Vue({
 el: '#app',
 router,
 template: '<App/>',
 components: { App }
})

修改为:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
// 引用API文件
import api from './api/index.js'
// 将API方法绑定到全局
Vue.prototype.$api = api
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
 el: '#app',
 router,
 template: '<App/>',
 components: { App }
})

通过以上的配置,我们就可以在项目中使用axios工具了,接下来我们来测试一下这个工具。

使用Axios工具

我们来修改一下 src/page/Index.vue 文件,将代码调整为以下代码:

<template>
 <div>index page</div>
</template>
<script>
export default {
 created () {
  this.$api.get('topics', null, r => {
   console.log(r)
  })
 }
}
</script>

我们在Index.vue中向浏览器的控制台输入一些接口请求到的数据,如果你和我也一样,那说明我们的接口配置完成正确。如下图:

VueJs 搭建Axios接口请求工具

如果你是按我的操作一步一步来,那最终结果应该和我一样。如果出错请仔细检查代码。

Javascript 相关文章推荐
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
js中设置元素class的三种方法小结
Aug 28 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
模板视图和AngularJS之间冲突的解决方法
Nov 22 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
JavaScript之json_动力节点Java学院整理
Jun 29 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
js面向对象编程OOP及函数式编程FP区别
Jul 07 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 #Javascript
详解vue+css3做交互特效的方法
Nov 20 #Javascript
解读ES6中class关键字
Nov 20 #Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 #Javascript
Node.js 中使用 async 函数的方法
Nov 20 #Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 #Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 #Javascript
You might like
php获取301跳转URL简单实例
2013/12/16 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Python实现EM算法实例代码
2020/10/04 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
幼儿园教师备课制度
2014/01/12 职场文书
个人委托书范本
2014/09/13 职场文书
好媳妇事迹材料
2014/12/24 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
学生犯错保证书
2015/05/09 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS