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 相关文章推荐
Jquery实现Div上下移动示例
Apr 23 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
JavaScript中this的用法实例分析
Dec 19 Javascript
微信小程序 页面传值详解
Mar 10 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
Aug 08 jQuery
小程序如何获取多个formId实现详解
Sep 20 Javascript
JavaScript隐式类型转换代码实例
May 29 Javascript
jquery轮播图插件使用方法详解
Jul 31 jQuery
Openlayers实现地图的基本操作
Sep 28 Javascript
React Native项目框架搭建的一些心得体会
May 28 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
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
php+mysql实现无限级分类
2015/11/11 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
xml和web特殊字符
2009/04/28 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
node使用request请求的方法
2019/12/20 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
Python群发邮件实例代码
2014/01/03 Python
python re正则表达式模块(Regular Expression)
2014/07/16 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
出纳员岗位职责
2014/03/13 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
2015年机关党委工作总结
2015/05/23 职场文书