基于axios封装fetch方法及调用实例


Posted in Javascript onFebruary 05, 2018

基础axios用法请看axios官网

//依赖于axios对私有ajax进行修改
import Qs from 'qs'
import axios from 'axios'
import router from 'router/index'
import {errorPrompt, loading, closeLoading} from 'util/util'
export const status = {
 SUCCESS: '100',
 NET_ERR: '101', // 网络连接异常,请稍候再试
 BIZ_ERR: '103', // 业务请求异常
 NO_AUTH: '104'
}
export function fetch(options) {
 return new Promise((resolve, reject) => {
 let instance = axios.create({
  baseURL: process.env.BASE_API,
  timeout: 2000,
  headers: {
  // "tracecode": window.encodeURIComponent(JSON.stringify({"ua":"","cv":"20161230","token":"3dwo0onUUsPKVJcP8tk","os":"windows10","app":"kind","ws":"1*1","pkey":"f8caf7d7-a5d4-4710-b06f-28a922b6a467"}))
  "tracecode": commonBizHeader(isManager(options)),
  'Content-Type': 'application/x-www-form-urlencoded'
  },
  transformRequest: [function (data) {
  // Do whatever you want to transform the data
  let ret = ''
  for (let it in data) {
   ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  }
  return ret
  }]
 });
 instance.interceptors.request.use(function (response) {
  // 请求拦截
  loading();
  return response;
 }, function (error) {
  console.log('error 请求拦截 : ', error)
  return Promise.reject(error);
 });
 instance(options)
  .then(response => {
   const res = response.data;
   if (res.errorCode != status.SUCCESS) {
   switch (res.errorCode) {
    case status.NET_ERR: {
    errorPrompt(res.errorMsg)
    reject(res)
    break;
    }
    case status.BIZ_ERR: {
    errorPrompt(res.errorMsg)
    reject(res)
    break;
    }
    case status.NO_AUTH: {
    errorPrompt(res.errorMsg)
    let session = require("storejs")
    if (isManager(options)) { // 管理端
     session.remove("managerUserToken")
     router.push({path: '/manager/login'})
    } else {
     session.remove("clientUserToken")
     router.push({path: '/client/login'})
    }
    reject(res)
    break
    }
   }
   }
   closeLoading();
   resolve(res);
  }).catch(error => {
   closeLoading();
   errorPrompt('网络连接错误,请检查您的网络')
   console.log('error', error); // for debug
   reject(error);
  });
 });
}
function commonBizHeader (isManager) {
 let session = require("storejs");
 let params = {}
 params['ua'] = window.navigator.userAgent.toLowerCase()
 params['cv'] = '123456'
 params['ws'] = window.screen.height + '*' + window.screen.width
 params['token'] = "123456"
 params['os'] = window.navigator.appCodeName
 if (isManager) {
 params['token'] = session.get('managerUserToken') // 管理 - 用户令牌
 } else {
 params['token'] = session.get('clientUserToken') // 用户 - 用户令牌
 }
 params['app'] = 'kind'
 let UUID = session.get('pkey')
 if (!UUID) {
 UUID = getUUID()
 window.localStorage.setItem('pkey', UUID)
 }
 return encodeURIComponent(JSON.stringify(params))
}
function isManager(options) {
 return options && options.url && options.url.indexOf("/api/worker") != -1
}
/**
 * 获取UUID
 * @returns {string}
 */
export function getUUID() {
 let len = 32 // 32长度
 let radix = 16 // 16进制
 let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
 let uuid = []
 let i
 radix = radix || chars.length
 if (len) {
 for (i = 0; i < len; i++) {
  uuid[i] = chars[0 | Math.random() * radix]
 }
 } else {
 var r
 uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
 uuid[14] = '4'
 for (i = 0; i < 36; i++) {
  if (!uuid[i]) {
  r = 0 | Math.random() * 16
  uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r]
  }
 }
 }
 return uuid.join('').toLowerCase()
}

这是在vue的项目中:在api中调用方法如下(react刚开始学,还在做简单demo)

import {fetch} from 'api/fetch'
export const callAuthCode = (userPhone) => {
 return fetch({
 url: '/api/auth/code',
 method: 'post',
 data: ({
  userPhone: userPhone,
 }),
 })
}

因为我们这边的后台要求严格区分get/post请求,所以封装的方法调用中必须带有method,如后台已经处理好,全部可进行post请求,则可以参照axios官网里面将方法全部改为.post

关于fetch方法的说明:主要进行封装了请求拦截,响应拦截,默认请求体由json格式转换form格式,当然,这些都是在axios官网里可以找到的,不过是集合下了而已

关于请求头部分请不要直接套用,这是我们这边后台要求特殊配置的,后台接口三端共用,必须区分是哪里在调用

以上这篇基于axios封装fetch方法及调用实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript版代码高亮
Jun 26 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
Dec 04 Javascript
封装属于自己的JS组件
Jan 27 Javascript
js带闹铃功能的倒计时代码
Sep 29 Javascript
JS前端笔试题分析
Dec 19 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
javascript深拷贝的原理与实现方法分析
Apr 10 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
vue2.0模拟锚点的实例
Mar 14 Javascript
javascript实现文本框标签验证的实例代码
Oct 14 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 #Javascript
JS中Map和ForEach的区别
Feb 05 #Javascript
完美解决axios跨域请求出错的问题
Feb 05 #Javascript
vue 页面加载进度条组件实例
Feb 05 #Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 #Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 #Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 #Javascript
You might like
php 如何获取数组第一个值
2013/08/06 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
JavaScript学习笔记之基础语法
2015/01/22 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
Django配置文件代码说明
2019/12/04 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
RIP版本1跟版本2的区别
2013/12/30 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
企事业单位求职者的自我评价
2013/12/28 职场文书
中专生职业生涯规划书范文
2014/01/10 职场文书
住房租房协议书
2014/08/20 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
暑期工社会实践报告
2015/07/13 职场文书