基于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 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
Javascript 陷阱 window全局对象
Nov 26 Javascript
JavaScript 未结束的字符串常量常见解决方法
Jan 24 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
jquery树形菜单效果的简单实例
Jun 06 Javascript
怎样判断jQuery当前元素是隐藏还是显示
Nov 23 Javascript
Node.js安装配置图文教程
May 10 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 Javascript
React-vscode使用jsx语法的问题及解决方法
Jun 21 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 空格,换行,跳格使用说明
2009/12/18 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
js里的prototype使用示例
2010/11/19 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
详解Vue之计算属性
2020/06/20 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
python字符串排序方法
2014/08/29 Python
寻找网站后台地址的python脚本
2014/09/01 Python
python中global与nonlocal比较
2014/11/21 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
幼儿教师研修感言
2014/02/12 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技