taro请求工具封装

2023-11-08

taro框架是一个跨端兼容的开发框架,自带了请求相关的API,虽然灵活,但是封装程度并不高,会导致比较多的代码冗余,因此封装了一个请求相关的工具

思路如下:

  1、请求和响应需要拦截器,针对不同的情况做不同的处理

  2、开发中分为开发,测试,生成环境,要根据不同的环境做适配

  3、请求分为get、post、delete、put,调用不同的接口还是有点麻烦的,能不能封装一个工具只      调一个接口,然后自动做适配呢?

实现如下:

1、在src下创建network文件夹,这里存放请求封装相关的文件

2、创建baseUrl.ts  根据不同的环境读取不同的地址

const getBaseUrl = () => {
    let BASE_URL = '';
    if (process.env.NODE_ENV === 'development') {
      //开发环境 - 根据请求不同返回不同的BASE_URL
      BASE_URL = 'https://cn.vuejs.org/'
    } else {
      // 生产环境
      BASE_URL = 'https://cn.vuejs.org/'
    }
    return BASE_URL
  }
   
  export default getBaseUrl;

3、创建config.ts,定义响应的状态码

export const HTTP_STATUS = {
    SUCCESS: 200,
    CREATED: 201,
    ACCEPTED: 202,
    CLIENT_ERROR: 400,
    AUTHENTICATE: 401,
    FORBIDDEN: 403,
    NOT_FOUND: 404,
    SERVER_ERROR: 500,
    BAD_GATEWAY: 502,
    SERVICE_UNAVAILABLE: 503,
    GATEWAY_TIMEOUT: 504
  }

4、定义utils.ts,当需要登录才可以请求时,维护处理逻辑

import Taro from "@tarojs/taro";
/**
 * @description 获取当前页url
 */
export const getCurrentPageUrl = () => {
  let pages = Taro.getCurrentPages()
  let currentPage = pages[pages.length - 1]
  let url = currentPage.route
  return url
}
 
export const pageToLogin = () => {
  let path = getCurrentPageUrl()
  Taro.clearStorage()
  if (!path.includes('login')) {
    Taro.reLaunch({
      url: "/pages/login/login"
    });
  }
}

5、定义拦截器interceptors.ts

import Taro from "@tarojs/taro"
import { pageToLogin } from "./utils"
import { HTTP_STATUS } from './config'
 
const customInterceptor = (chain) => {
 
  const requestParams = chain.requestParams
  Taro.showLoading({
    title: '加载中',
  })
  return chain.proceed(requestParams).then(res => {
    Taro.hideLoading()
    // 只要请求成功,不管返回什么状态码,都走这个回调
    if (res.statusCode === HTTP_STATUS.NOT_FOUND) {
      return Promise.reject({ desc: '请求资源不存在' })
 
    } else if (res.statusCode === HTTP_STATUS.BAD_GATEWAY) {
      return Promise.reject({ desc: "服务端出现了问题" })
 
    } else if (res.statusCode === HTTP_STATUS.FORBIDDEN) {
      Taro.setStorageSync("Authorization", "")
      pageToLogin()
      // TODO 根据自身业务修改
      return Promise.reject({ desc: "没有权限访问" });
 
    } else if (res.statusCode === HTTP_STATUS.AUTHENTICATE) {
      Taro.setStorageSync("Authorization", "")
      pageToLogin()
      return Promise.reject({ desc: "需要鉴权" })
 
    } else if (res.statusCode === HTTP_STATUS.SERVER_ERROR) {
      return Promise.reject({ desc: "服务器错误" });
    } else if (res.statusCode === HTTP_STATUS.SUCCESS) {
        return res.data

      // if (res.data.code === 0) {
      //   return res.data
      // } else if (res.data.code == '-100') {
      //   //非法登录
      //   pageToLogin()
      // }
      // else {
      //   return Promise.reject(res.data)
      // }
    }
  }).catch(error=> {
    Taro.hideLoading()
    console.error(error)
    return Promise.reject(error)
  })
}
 
// Taro 提供了两个内置拦截器
// logInterceptor - 用于打印请求的相关信息
// timeoutInterceptor - 在请求超时时抛出错误。
// const interceptors = [customInterceptor, Taro.interceptors.logInterceptor]
const interceptors = [customInterceptor]
 
export default interceptors

6、定义request.ts,适配taro的请求API

import Taro from '@tarojs/taro'
import getBaseUrl from './baseUrl'
import interceptors from './interceptors'
  
//添加拦截器
interceptors.forEach(interceptorItem => Taro.addInterceptor(interceptorItem))
    
    const request=function axios(params) {
        let { url, data,method,headers} = params;
        const BASE_URL = getBaseUrl();
        // let contentType = "application/x-www-form-urlencoded";
        let contentType = "application/json;charset=UTF-8";
        contentType = headers?.contentType || contentType;

        const option = {
            url: BASE_URL + url,  //地址
            data: data,   //传参
            method: method, //请求方式
            timeout:50000, // 超时时间
            header: {  //请求头
              'content-type': contentType,     
              'Authorization':Taro.getStorageSync('Authorization')
            }
          };
        return Taro.request(option);
    }

export default request

7、以上关于请求工具就封装好了,接下来就是使用了,我向来不太赞成后台的路径等相关API信息写在视图文件中,比较乱,而且不好维护。所以

在src下创建一个api目录,创建demo.ts(这里仅仅是一个示例,仅供参考)

import request from '@/network/request'

const attractInvestmentApi = {
  baidu: 'api/composition-api-setup.html#usage-with-render-functions',
}

export function taroTest (parameter) {
  return request({
    url: attractInvestmentApi.baidu,
    method: 'get',
    data: parameter,
    // headers: {
    //   'contentType': 'application/json'
    // }
  })
}


8、实际业务中调用后端api(这里仅仅是一个示例,仅供参考)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

taro请求工具封装 的相关文章

随机推荐

  • Stanford CS143 速通PA1教程

    今天做完了CS143的PA1 感觉最难的地方在于官方没有具体的文档 edX 然后COOL语言调试比较困难 以下是我对同样打算入坑CS143的同学的一些帮助吧 速通前的准备 Virtual VM Setup 如果还没有搭好环境的 建议跟着官网
  • 信号和槽机制

    信号和槽是一种高级接口 应用于对象之间的通信 它是QT的核心特性 也是QT区别于其它工具包的重要地方 信号和槽是QT自行定义的一种通信机制 它独立于标准的C C 语言 因此要正确的处理信号和槽 必须借助于一个称为moc Meta Objec
  • c++申请内存空间的本质

    c 申请内存空间的本质 void teseTwo char cc 8 cout lt lt void cc lt lt endl cout lt lt 将cc的内存空间存储字符串 lt lt endl strcpy s cc hello c
  • Unity解析服务器Json文件

    文章目录 需求 Json文件存在服务器上 Unity要获取并解析它 原理 通过 UnityWebRequest类获取服务器文本 的功能 把Json文件传输到本地 再通过写好的解析类 Unity自带的JsonUtility FromJson
  • Linux下运行Jmeter压测

    一 在Linux服务器先安装SDK 1 先从官网下载jdk1 8 0 131 tar gz 再从本地上传到Linux服务器 2 解压 tar xzf jdk1 8 0 131 tar gz 生成文件夹 jdk1 8 0 131 3 在 us
  • 配置tomcat5.5 jndi 各种配置方式 分析总结(mysql)

    准备工作 安装tomcat5 5 注意这点 安装mysql 拷贝mysql驱动到tomcat home common lib下 新建一个web工程 在工程中加入index jsp
  • 获取B站SESSDATA及解决403

    获取B站SESSDATA 登录B站 按F12打开控制台 找到SESSDATA复制即可 解决B站防盗链 403 B站开启了防盗链 利用的是HTTP的Referer属性做判断 如果Referer是他白名单之外的网站 就会返回403 全站图片使用
  • 4-4面向对象编程(上)----再谈方法(3)--方法参数的值传递机制

    重点 3 方法参数的值传递机制 一 方法 必须由其所在类或对象调用才有意义 若方法含以后参数 1 形参 方法声明时的参数 2 实参 方法调用时实际传给形参的参数值 二 Java的实参值如何传入方法中的 Java里方法的参数传递方式只有一种
  • Android app专项测试之耗电量测试

    前言 耗电量指标 待机时间成关注目标 提升用户体验 通过不同的测试场景 找出app高耗电的场景并解决 01 需要的环境准备 1 python2 7 必须是2 7 3 X版本是不支持的 2 golang语言的开发环境 3 Android SD
  • OpenCV-Python 图像缩放

    缩放就是调整图片的大小 使用cv2 resize 函数实现缩放 图像的大小可以手动指定 也可以指定缩放比例 也可使用不同的插值方法 插值方式 cv INTER NEAREST 最近邻插值 cv INTER LINEAR 双线性插值 cv I
  • Qt学习之Qt基础入门(上)

    1 前言 上一篇博客 简单的介绍了一下C 的面向对象编程 这篇博客就主要是用来入门Qt 废话不多说 开干 Qt入门系列 Qt学习之C 基础 Qt学习之Qt安装 Qt学习之Qt基础入门 上 Qt学习之Qt基础入门 中 Qt学习之Qt基础入门
  • 第一个Echarts

    安装node js教程 解决cnpm v 不能运行的问题 使用pycharm进行代码编写 步骤 1 在pycharm中新建一个文件夹 在文件夹中新建一个html file 2 在pycharm project中 找到新建文件夹 在文件夹中新
  • 20仿函数(functors)

    1 仿函数概述 仿函数 functors 是早期的命名 新名称是函数对象 function objects 函数对象是指一种具有函数特质的对象 所以仿函数的本质就是一个行为类似函数的对象 仿函数主要用途是搭配STL算法 这种东西在调用者可以
  • Search for a Range

    Given an array of integers nums sorted in ascending order find the starting and ending position of a given target value
  • Dubbo 、 OpenFegin 远程服务调用的使用区别

    Dubbo 与 OpenFegin 都利用于远程调用层面 其中包括协议 负载均衡等都有不同的点 并且在使用上面也有不同的形式 简约记录一下两者的用法 1 服务端 dubbo 1 添加dubbo依赖 2 服务类添加 DubboService
  • jmeter——生成多样的接口自动化html报告

    jmeter 生成多样的接口自动化html报告 一 实现目的 二 实现效果 1 jmter自带的HTML报告 2 jmeter ant报告优化 3 批量执行jmeter工具 4 jmeter allure生成测试报告 三 实现方案 1 jm
  • 数据结构与算法——线性表

    个人主页 bit 系列专栏 Linux Ubuntu 入门必看 C语言刷题 目录 2 1线性表的定义和特点 2 2 案例引入 2 3 线性表的定义 2 1线性表的定义和特点 线性表是具有相同特新的数据元素的一个有限序列 列如 同一线性表中的
  • 解决:Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\辰之星\AppData\Roaming\npm\node_modules\n

    解决 Error ERR REQUIRE ESM require of ES Module C Users 辰之星 AppData Roaming npm node modules nrm node modules open index j
  • 特征工程是什么?

    特征工程是指对原始数据进行预处理和转换 以提取出对机器学习算法建模有用的特征的过程 特征工程是机器学习中非常重要的一步 它可以显著影响模型的性能 下面是一些常见的特征工程技术和方法 数据清洗 处理缺失值 异常值和重复值 确保数据的质量和完整
  • taro请求工具封装

    taro框架是一个跨端兼容的开发框架 自带了请求相关的API 虽然灵活 但是封装程度并不高 会导致比较多的代码冗余 因此封装了一个请求相关的工具 思路如下 1 请求和响应需要拦截器 针对不同的情况做不同的处理 2 开发中分为开发 测试 生成