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 相关文章推荐
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
Jul 25 Javascript
javascript URL编码和解码使用说明
Apr 12 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
js中字符替换函数String.replace()使用技巧
Aug 14 Javascript
简单的js表单验证函数
Oct 28 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
jQuery表单验证简单示例
Oct 17 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
vue数据操作之点击事件实现num加减功能示例
Jan 19 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 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
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
python2.7的编码问题与解决方法
2016/10/04 Python
python购物车程序简单代码
2018/04/18 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Pytorch的mean和std调查实例
2020/01/02 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
信息工程学院毕业生推荐信
2013/11/05 职场文书
法人委托书的范本格式
2014/09/11 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
《称赞》教学反思
2016/02/17 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书