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 iframe的相互操作浅析
Oct 14 Javascript
JQuery 常用操作代码
Mar 14 Javascript
js 手机号码合法性验证代码集合
Sep 29 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
jQuery插件扩展测试实例
Jun 21 Javascript
手机软键盘弹出时影响布局的解决方法
Dec 15 Javascript
JS日程管理插件FullCalendar中文说明文档
Feb 06 Javascript
JS排序之冒泡排序详解
Apr 08 Javascript
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
JS简单实现动态添加HTML标记的方法示例
Apr 08 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
解析smarty模板中类似for的功能实现
2013/06/18 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
对python生成业务报表的实例详解
2019/02/03 Python
深入浅析Python中的迭代器
2019/06/04 Python
Django--权限Permissions的例子
2019/08/28 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
生产内勤岗位职责
2013/12/07 职场文书
写自荐信要注意什么
2013/12/26 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
团队口号大全
2014/06/06 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS