首页 > 其他分享 >封装uniapp的request

封装uniapp的request

时间:2023-11-22 15:22:54浏览次数:31  
标签:uniapp Vue const url request staticVariables isLoading 封装 data

1 uni.request() 二次封装

import Vue from 'vue'

const baseUrl = 'http://127.0.0.1:8080' // 服务器地址
const imageUrl = baseUrl

const staticVariables = {
  BASE_URL: baseUrl + '/api',
  TIME_OUT: 10000,
  SSL_VERIFY: false,
  DURATION: 500,
  MASK: true,
  TOKEN_PREFIX: 'Bearer ',
  FORM_DATA: 'application/x-www-form-urlencoded',
  JSON: 'application/json'
}

/**
 * 上传图片到本地服务器
 * @param path
 * @param baseOrFile
 * @param fileType 可选值:base64/file
 * @param type  可选值:image/video/audio
 * @returns fileName
 */
const uploadFileToServe = (path, baseOrFile, fileType = 'file', type = 'image') => {
  let file = void 0
  if (fileType === 'base64') {
    const base64 = {
      dataURL: baseOrFile, // 用url方式表示的base64图片数据
      type: 'image/png' // 文件类型
    }
    const result = convertBase64UrlToBlob(base64)
    file = blobToFile(result, (new Date().getTime() + '.png'))
  } else {
    file = baseOrFile
  }
  return new Promise((resolve, reject) => {
    uni.uploadFile({
      url: staticVariables.BASE_URL + path,
      header: {
        'Authorization': Vue.prototype.TOKEN_PREFIX + uni.getStorageSync('token')
      },
      file: file,
      fileType: "image",
      name: "file",
      success: (res) => {
        const object = JSON.parse(res.data);
        console.log(object);
        if (object.code === 0) {
          resolve(object.data.fileName)
        } else {
          if (object.code === 422) {
            console.log(Vue.prototype.$store);
            Vue.prototype.$store.commit('logout')
            uni.reLaunch({
                url: '/pages/login/login'
              })
          } else {
            console.log("失败原因" + object);
            uni.showToast({
              title: object.msg,
              icon: "error",
              duration: 1000
            })
            reject(object.msg)
          }

        }
      },
      fail: (err) => {
        reject(err)
        throw new Error(err);
      }
    })
  })
}

/**
 * base64转blob
 * @param base64
 * @returns {Blob}
 */
const convertBase64UrlToBlob = (base64) => {
  let urlData = base64.dataURL
  let type = base64.type
  let bytes = null
  if (urlData.split(',').length > 1) {//是否带前缀
    bytes = window.atob(urlData.split(',')[1]) // 去掉url的头,并转换为byte
  } else {
    bytes = window.atob(urlData)
  }
  // 处理异常,将ascii码小于0的转换为大于0
  let ab = new ArrayBuffer(bytes.length)
  let ia = new Uint8Array(ab)
  for (let i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i)
  }
  return new Blob([ab], { type: type })
}

/**
 * 将blob转换为file
 * @param theBlob
 * @param fileName
 * @returns {*}
 */
const blobToFile = (theBlob, fileName) => {
  theBlob.lastModifiedDate = new Date();
  theBlob.name = fileName;
  return theBlob;
}

/**
 * object转换为formData格式
 * @param data
 * @returns {string}
 */
const qs = (data) => {
  let ret = ''
  for (let it in data) {
    ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  }
  return ret.substring(0, ret.length - 1)
}

/**
 * 请求工具
 * @param url
 * @param method
 * @param ContentType
 * @param data
 * @param isLoading
 * @returns {Promise<unknown>}
 */
const request = (url, method, ContentType, data, isLoading = true) => {
  if (isLoading) {
    uni.showLoading({
      title: "请求中...",
      mask: staticVariables.MASK
    })
  }
  return new Promise((resolve, reject) => {
    uni.request({
      url: staticVariables.BASE_URL + url,
      method: method,
      data: data,
      header: {
        'Content-Type': ContentType,
        'Authorization': uni.getStorageSync('token')
      },
      timeout: staticVariables.TIME_OUT,
      sslVerify: staticVariables.SSL_VERIFY,
      success(res) {
        if (res.data.code === 0) {
          resolve(res.data)
        } else {
          uni.showToast({
            title: res.data.msg,
            icon: 'none'
          });
          reject(res.data)
        }

      },
      fail(err) {
        uni.showToast({
          title: err.errMsg,
          icon: 'none'
        });
        reject(err)
      },
      complete() {
        setTimeout(() => {
          uni.hideLoading()
        }, 200)
      },
    });
  })
}

const get = async(url, data, isLoading) => {
  return await request(url, 'get', staticVariables.JSON, data, isLoading)
}

const getForm = async(url, data, isLoading) => {
  return await request(url, 'get', staticVariables.FORM_DATA, data, isLoading)
}

const post = async(url, data, isLoading) => {
  return await request(url, 'post', staticVariables.JSON, data, isLoading)
}

const postForm = async(url, data, isLoading) => {
  return await request(url, 'post', staticVariables.FORM_DATA, qs(data), isLoading)
}

const put = async(url, data, isLoading) => {
  return await request(url, 'put', staticVariables.JSON, data, isLoading)
}

const putForm = async(url, data, isLoading) => {
  return await request(url, 'put', staticVariables.FORM_DATA, qs(data), isLoading)
}

const deleted = async(url, data, isLoading) => {
  return await request(url, 'delete', staticVariables.JSON, data, isLoading)
}

const deletedForm = async(url, data, isLoading) => {
  return await request(url, 'delete', staticVariables.FORM_DATA, qs(data), isLoading)
}

Vue.prototype.uploadFileToServe = uploadFileToServe
Vue.prototype.get = get
Vue.prototype.getForm = getForm
Vue.prototype.post = post
Vue.prototype.postForm = postForm
Vue.prototype.put = put
Vue.prototype.putForm = putForm
Vue.prototype.deleted = deleted
Vue.prototype.deletedForm = deletedForm
Vue.prototype.imageUrl = imageUrl

export default {
  uploadFileToServe, get, getForm, post, postForm, put, putForm, deleted, deletedForm, imageUrl
}

使用的话只需在main.js导入即可使用

// main.js
import '@/common/request.js'

// 使用
this.get('/test/test')
this.post('/test/test', {data: '1'})

标签:uniapp,Vue,const,url,request,staticVariables,isLoading,封装,data
From: https://www.cnblogs.com/snail2018/p/17849099.html

相关文章

  • 封装 luckysheet 组件
    一维数组和二维数组根据luckysheet.getAllSheets()获得所有的数据表数组,其中:cellData是一维数组data是二维数组代码父组件<template><divclass="app-container"v-hasPermi="['proMana:directory:detail:proHome']"><!--项目首页,projectId:......
  • uniapp app上传图片并设置超过10m进行图片压缩
    组件页面<template>   <viewclass="upload-wrapper">      <viewv-if="pictureUrl.length">         <viewclass="preview"v-for="(item,index)inpictureUrl":key='index'>        ......
  • uniapp使用第三方插件image-tools进行图片转base64
    最近做的这个项目原来是原生android开发的,然后图片上传功能是 前端获取图片->图片转成base64字符串(base64编码)->传递给服务器后端->服务器接受base64字符串数据->获取到的base64转成图片jpg(解码)->存入服务器,并写入数据库后来因为原生安卓太麻烦了,转成了uniapp进行开......
  • 如何优雅的使用微信小程序的wx.request请求(封装request.js工具类)
    首先官方的文档不是支持Promise风格的请求我们通过官方文档可以看到微信小程序发请求的一些具体参数,下面的代码展示了用wx.request()发送的一个标准请求:wx.request({     url:"https://xxx.com",     method:"POST",     data:{   ......
  • uniapp之安卓端pdf预览
    uniapp之安卓端pdf预览原理:将文件下载到本地,使用uniapi预览文件exportPDF(){ uni.downloadFile({ url:"http://192.168.1.237:9000/profile/statute/937820.pdf", success:res=>{ console.log(res) if(res.statusCode===200){ ......
  • UNIAPP返回上一页并参数 uni.$on、uni.$off、uni.$once 和 uni.$emit
    WPFPrism事件聚合器-订阅/发布事件https://www.cnblogs.com/douyuanjun/p/17788957.html结合JS理解更容易理解:https://www.cnblogs.com/douyuanjun/p/17465402.html//传参给上一页confirm:function(){ if(this.list.length>=1){ //选择观演人 uni.$emit('selectV......
  • Flask之request.json()和 request.form.get()
    在Flask中,request.json和request.form.get()用于从HTTP请求中获取数据,但它们主要用于不同类型的数据传递方式。request.json:用于从包含JSON数据的请求体中提取数据。适用于POST请求中包含JSON数据的情况,通常是通过AJAX请求或使用Content-Type:application/json标头发......
  • Python下使用requests库遇到的问题及解决方案
    每一盏灯都有一个故事……当凌晨2点我的房间灯还亮着时,那就是我与BUG的一场生死博弈。一个人静静地坐在电脑前不断地写代码,感觉快要麻木了,好比闭关修炼一样枯燥无味。最终当我打通任督二脉后,bug修复迎来的一片曙光。一、问题背景在最近的项目中,我使用Python3.6和DigestAuth进行身......
  • IndexedDB设计及封装
    设计思路固定数据表键值对表用于存储数据库相关的信息库字段构成表储存非固定数据表结构非固定数据表通过库字段构成表进行创建或更新划重点数据库初始创建或更新后会先触发onupgradeneeded方法,然后再触发onsuccess方法,如果在onupgradeneeded方法中执行了表结构操作的......
  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......