axios进阶实践之利用最优雅的方式写ajax请求


Posted in Javascript onDecember 20, 2017

前言

ajax相信不用过多介绍了,作者坚信可以用配置解决的问题,请勿硬编码,下面话不多说了,来一看看详细的介绍吧。

姊妹篇 jQuery进阶:用最优雅的方式写ajax请求

axios是Vue官方推荐的ajax库, 用来取代vue-resource。更多详细的基础知识可以参考这篇文章:https://3water.com/article/109444.htm

优点:

  • 增加一个ajax接口,只需要在配置文件里多写几行就可以
  • 不需要在组件中写axios调用,直接调用api方法,很方便
  • 如果接口有调整,只需要修改一下接口配置文件就可以
  • 统一管理接口配置

1. content-type配置

// filename: content-type.js
module.exports = {
 formData: 'application/x-www-form-urlencoded; charset=UTF-8',
 json: 'application/json; charset=UTF-8'
}

2. api 配置

// filename: api-sdk-conf.js
import contentType from './content-type'
export default {
 baseURL: 'http://192.168.40.231:30412',
 apis: [
 {
  name: 'login',
  path: '/api/security/login?{{id}}',
  method: 'post',
  contentType: contentType.formData,
  status: {
  401: '用户名或者密码错误'
  }
 }
 ]
}

3. request.js 方法

// request.js
import axios from 'axios'
import qs from 'qs'
import contentType from '@/config/content-type'
import apiConf from '@/config/api-sdk-conf'
var api = {}
// render 函数用来渲染路径上的变量, 算是一个微型的模板渲染工具
// 例如render('/{{userId}}/{{type}}/{{query}}', {userId:1,type:2, query:3})
// 会被渲染成 /1/2/3
function render (tpl, data) {
 var re = /{{([^}]+)?}}/
 var match = ''
 while ((match = re.exec(tpl))) {
 tpl = tpl.replace(match[0], data[match[1]])
 }
 return tpl
}
// fire中的this, 会动态绑定到每个接口上
function fire (query = {}, payload = '') {
 // qs 特别处理 formData类型的数据
 if (this.contentType === contentType.formData) {
 payload = qs.stringify(payload)
 } 
 // 直接返回axios实例,方便调用then,或者catch方法
 return axios({
 method: this.method,
 url: render(this.url, query),
 data: payload,
 headers: {
  contentType: this.contentType
 }
 })
}
apiConf.apis.forEach((item) => {
 api[item.name] = {
 url: apiConf.baseURL + item.path,
 method: item.method,
 status: item.status,
 contentType: item.contentType,
 fire: fire
 }
})
export default api

4. 在组件中使用

import api from '@/apis/request'
...
  api.login.fire({id: '?heiheihei'}, {
  username: 'admin',
  password: 'admin',
  namespace: '_system'
  })
...

浏览器结果:

Request URL:http://192.168.40.231:30412/api/security/login??heiheihei
Request Method:POST
Status Code:200 OK
Remote Address:192.168.40.231:30412
Referrer Policy:no-referrer-when-downgrade
POST /api/security/login??heiheihei HTTP/1.1
Host: 192.168.40.231:30412
Connection: keep-alive
Content-Length: 47
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
contentType: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
username=admin&password=admin&namespace=_system

5. 更多

有个地方我不是很明白,希望懂的人可以给我解答一下

如果某个组件中只需要login方法,但是我这样写会报错。

import {login} from '@/apis/request'

这样写的前提是要在request.js最后写上

export var login = api.login
    

但是这是我不想要的,因为每次增加一个接口,这里都要export一次, 这不符合开放闭合原则,请问有什么更好的方法吗?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript与CSS复习(二)
Jun 29 Javascript
javascript使用数组的push方法完成快速排序
Sep 15 Javascript
jQuery实现拖拽效果插件的方法
Mar 23 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
Node.js实现数据推送
Apr 14 Javascript
javascript匀速动画和缓冲动画详解
Oct 20 Javascript
详解angularjs获取元素以及angular.element()用法
Jul 25 Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
Dec 10 Javascript
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
VUE递归树形实现多级列表
Jul 15 Vue.js
vue.js $refs和$emit 父子组件交互的方法
Dec 20 #Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
Dec 20 #jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 #Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 #Javascript
详解vue mixins和extends的巧妙用法
Dec 20 #Javascript
canvas轨迹回放功能实现
Dec 20 #Javascript
jQuery实现动态控制页面元素的方法分析
Dec 20 #jQuery
You might like
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
如何对PHP程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
javascript写的日历类(基于pj)
2010/12/28 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
东方电视购物:东方CJ
2016/10/12 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
保安自我鉴定范文
2013/12/08 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
经典大学生求职信范文
2014/01/06 职场文书
学校欢迎标语
2014/06/18 职场文书
单位消防安全责任书
2014/07/23 职场文书
尊师重教演讲稿
2014/09/04 职场文书
交通工程专业推荐信
2014/09/06 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
2014年绿化工作总结
2014/12/09 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers