基于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 预解析
Oct 25 Javascript
JavaScript 利用Cookie记录用户登录信息
Dec 08 Javascript
JavaScript Event学习第六章 事件的访问
Feb 07 Javascript
Javascript核心读书有感之词法结构
Feb 01 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
Sep 05 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
JavaScript字符串对象
Jan 14 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
AngularJS动态生成select下拉框的方法实例
Nov 17 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
实用函数4
2007/11/08 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python在linux中输出带颜色的文字的方法
2014/06/19 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
如何在python中实现线性回归
2020/08/10 Python
如何使用python写截屏小工具
2020/09/29 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
C语言笔试集
2012/07/24 面试题
质检员岗位职责
2013/12/17 职场文书
自我反省检讨书
2014/01/23 职场文书
音乐教学反思
2014/02/02 职场文书
黄金酒广告词
2014/03/21 职场文书
研讨会主持词
2014/04/02 职场文书
护士医德考评自我评价
2015/03/03 职场文书
幼儿园辞职信
2015/05/13 职场文书
信息简报范文
2015/07/21 职场文书
公司人事管理制度
2015/08/05 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
浅谈克隆 JavaScript
2021/11/02 Javascript
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers