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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
js的Prototype属性解释及常用方法
May 08 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
Sep 10 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
Vue使用lodop实现打印小结
Jul 06 Javascript
js实现打字小游戏
Dec 17 Javascript
在vue中使用防抖函数组件操作
Jul 26 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命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
PHP7常量数组用法分析
2016/09/26 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
php源码的安装方法和实例
2019/09/26 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
javascript进行数组追加方法小结
2014/06/16 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
浅谈python中set使用
2016/06/30 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
python监控进程脚本
2018/04/12 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
村级个人对照检查材料
2014/08/22 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js