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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
JS Excel读取和写入操作(模板操作)实现代码
Apr 11 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
jquery实现简单的遮罩层
Jan 08 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 jQuery
vue.js移动端app之上拉加载以及下拉刷新实战
Sep 11 Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
微信小程序封装多张图片上传api代码实例
Dec 30 Javascript
JavaScript实现五子棋小游戏
Oct 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
收音机的保养
2021/03/01 无线电
php中的观察者模式
2010/03/24 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
jQuery动态添加
2016/04/07 Javascript
javascript中this指向详解
2016/04/23 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
python list语法学习(带例子)
2013/11/01 Python
python搜索指定目录的方法
2015/04/29 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
python实现黑客字幕雨效果
2018/06/21 Python
Pytorch释放显存占用方式
2020/01/13 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
益模软件Java笔试题
2012/03/27 面试题
产假请假条
2014/04/10 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
户外亲子活动总结
2015/05/08 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
Redis实现一个账号只能登录一个设备
2022/04/19 Redis
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS