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 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
IE与firefox之jquery用法区别
Oct 03 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
Jun 27 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
javascript父子页面通讯实例详解
Jul 17 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
微信小程序实现滚动消息通知
Feb 02 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
vue+axios+mock.js环境搭建的方法步骤
Aug 28 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
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
thinkphp实现图片上传功能分享
2014/03/04 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
详解python3实现的web端json通信协议
2016/12/29 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python ubplot使用方法解析
2020/01/10 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
详解python变量与数据类型
2020/08/25 Python
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
岗位职责范本
2013/11/23 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
英语复习计划
2015/01/19 职场文书
调解书格式范本
2015/05/20 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
爱护环境建议书
2015/09/14 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android