Taro小程序配置网络请求

news2024/9/20 5:44:36

目录

  • 1. 创建目录结构
  • 2. 全局通用的config的变量配置
  • 3. 配置http网络请求
  • 4. 使用

1. 创建目录结构

  1. 在 src 目录下新建 service 目录,目录下创建 api 和 http 子目录
  2. 在 src 目录下新建 config 配置文件
    在这里插入图片描述

2. 全局通用的config的变量配置

在 config 文件中添加一下代码:

const debug = process.env.NODE_ENV !== "production";
export default {
    debug, //是否为开发环境 
    
    baseUrl: "http://192.168.1.1:3000", // 基本接口

    //请求状态码
    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,
    defineConstants: {
        LOCATION_APIKEY: JSON.stringify("IWYBZ-OGUKR-LK7WQ-W2AC5-XEHIJ-WDB24")
    }
};

3. 配置http网络请求

  1. 在 http 目录下新建 url.js 文件对 http 请求的 url 进行解析:
import config from '../../config'

const baseUrl = config.baseUrl; //基本接口地址

/**
 * GET 请求时,拼接请求URL
 * @param url 请求URL
 * @param params 请求参数
 * @returns {*}
 */
const handleUrl = url => params => {
    if (params) {
        let paramsArray = [];
        Object.keys(params).forEach(key => paramsArray.push(key + '=' + encodeURIComponent(params[key])));
        if (url.search(/\?/) === -1) {
            typeof (params) === 'object' ? url += '?' + paramsArray.join('&') : url
        } else {
            url += '&' + paramsArray.join('&')
        }
    }
    return baseUrl + url;
};


export { handleUrl }
  1. 在 http 目录下新建 interceptors.js 文件用于拦截网络请求:
  • 在 Taro 中的 Taro.addInterceptor 方法用于拦截网络请求,并可以对请求和响应进行处理。它拦截的是网络请求的状态,而不是接口返回的状态。
  • 具体来说,Taro.addInterceptor 方法允许你添加一个拦截器函数,在发送请求和接收响应的过程中进行拦截和处理。你可以在拦截器函数中对请求进行预处理,例如添加请求头、修改请求参数等,并对响应进行处理,例如检查响应状态码、解析响应数据等。
  • 这个拦截器函数在网络请求过程中被调用,并且可以访问请求的相关信息,如请求参数、请求方法、请求头等,以及响应的相关信息,如状态码、响应头、响应数据等。
import config from "../../config";
/**
 * 在调用 Taro.request 发起请求之前,调用 Taro.addInterceptor 方法为请求添加拦截器,拦截器的调用顺序遵循洋葱模型。 拦截器是一个函数,接受 chain 对象作为参数。
 * chain 对象中含有 requestParmas 属性,代表请求参数。拦截器内最后需要调用 chain.proceed(requestParams) 以调用下一个拦截器或发起请求。
 * Taro 提供了两个内置拦截器 logInterceptor 与 timeoutInterceptor,分别用于打印请求的相关信息和在请求超时时抛出错误。
 */

/**
 * 自定义请求结果拦截器,用户处理公共的返回值配置内容等
 * @param {*} chain 
 */
const customInterceptors = (chain) => {
    const requestParams = chain.requestParams; //请求参数
    
    // console.log(requestParams, "requestParams");

    //返回一个Promis
    return chain.proceed(requestParams).then(res => {
        // console.log(res.statusCode, "res.statusCode");
        // 只要请求成功,不管返回什么状态码,都走这个回调
        switch (res.statusCode) {
            //404
            case config.NOT_FOUND:
                return Promise.reject({ desc: '请求资源不存在' });
            //502
            case config.BAD_GATEWAY:
                return Promise.reject({ desc: '服务端出现了问题' });
            //403
            case config.FORBIDDEN:
                return Promise.reject({ desc: '没有权限访问' });
            //401
            case config.AUTHENTICATE:
                return Promise.reject({ desc: '需要鉴权:' + config.AUTHENTICATE });
            //500
            case config.SERVER_ERROR:
                return Promise.reject({ desc: '服务器错误' });
            //200
            case config.SUCCESS:
                //请求成功的返回值
                return res.data;
            default:
                return Promise.reject({ desc: "" })
        }
    }).catch(error => {
        return Promise.reject(error)
    })
}

//可扩展多个拦截器
const interceptors = [customInterceptors];

//导出拦截器的数组
export default interceptors;
  1. 在 src 目录下新建 httpUtils.js 文件用于配置 http 的请求封装工具:
//引入基础库
import Taro from "@tarojs/taro";
import config from "../../config";
import interceptors from "./interceptors";
import { handleUrl } from "./url";

//添加 Taro的拦截请求
interceptors.forEach(interceptorItem => Taro.addInterceptor(interceptorItem));

class HttpUtils {
    /**
     * 请求公共方法
     * @param {*} method Request的method类型  post 或者 get  
     * @param {*} url 请求的接口
     * @param {*} params 请求参数
     * @param {*} header 自定义请求头
     * @returns 返回promise 对象
     */
    RequestOptions (method = "GET", url = "", params = {}, header = null) {
        const baseUrl = config.baseUrl;
        let { contentType = "application/json" } = header || {};
        let loginToken = Taro.getStorageSync("logintoken") || "";

        let requestUrl = url;
        if (requestUrl.indexOf("http") < 0) {
            requestUrl = method == "GET" ? handleUrl(requestUrl)(params) : baseUrl + requestUrl;
        }

        let option = {
            url: requestUrl,  //地址
            data: method == "GET" ? {} : { ...params },   //传参
            method: method, //请求方式
            timeout: 30000, // 超时时间
            header: {  //请求头
                'content-type': contentType,
                'token': loginToken, // 临时token
                ...header,
            }
        };

        if (url.indexOf("/imapi/") >= 0) {
            option = {
                url: config.imlocalserverUrl + url,
                method: method, //请求方式
                data: method == "GET" ? {} : { ...params },   //传参
                timeout: 30000, // 超时时间
                header: {  //请求头
                    'content-type': contentType,
                    'token': loginToken, // 临时token 
                    ...header,
                }
            }
        }

        return Taro.request(option).then((res) => {
            if (!res.data) return;

            const { status, msg } = res.data;
            // console.log("请求的内容", res);

			// 对接口返回状态进行处理
            if (status == 201) {
            	// 错误信息
                Taro.showToast({
                    title: msg,
                    icon: 'none',
                    duration: 1500
                })
            } else if (status == 202) {
            	// ... 无token时退出登录的处理
            	               	
                return null;
            }

            return res.data;
        }).catch((rejectvalue) => {
            console.log("网络请求异常", rejectvalue, option);
            return null;
        });
    }

    /**
     * Taro的get基础请求
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    getRequest = (url, params = {}) => {
        return this.RequestOptions("GET", url, params);
    }

    /**
     * Taro的POST请求
     * @param {*} url 
     * @param {*} params 
     * @returns 
     */
    postRequest = (url, params, header = {}) => {
        return this.RequestOptions("POST", url, params, header);
    }
}

export default new HttpUtils();
  1. 在 src 目录下新建 index.js 文件进行 http 请求:
import HttpUtils from "./httpUtils";

/**
 * 从缓存中读取数据
 * @param isCache 是否缓存 预留缓存配置
 * @param requestType 请求类型
 * @returns {function(*=, *=, *=): (*|*)}
 */
const RequestData = (isCache = false, requestType) => (url, params, callback) => {
    // console.log(url, params);

    //默认的执行函数
    const requestFunc = (result) => {
        if (result) {
            if (callback && typeof callback === 'function') {
                return callback(result);
            } else {
                return result;
            }
        }
        //返回出来的promise
        let promise = requestType === 'GET' ? HttpUtils.getRequest(url, params) : requestType === 'POST' ? HttpUtils.postRequest(url, params) : HttpUtils.postRequest(url, params, { contentType: "application/json" }); //去网络拿数据
        if (callback && typeof callback === 'function') {
            promise.then(response => {
                return callback(response)
            })
        }
        return promise;
    };

    if (isCache) {
        return null;
    }

    // 预留缓存配置
    return requestFunc();
};


/**
 * GET 请求
 */
const Get = RequestData(false, 'GET');

/**
 * POST 请求
 */
const Post = RequestData(false, 'POST');

/**
 * 上传文件,上传图片
 */
const UploadFile = RequestData(false, "File");

export { Get, Post, UploadFile };

4. 使用

在 api 目录下新建 index.js 文件:

import { Get, Post, UploadFile } from '../http';

export const postText= data => Post('/api/post_text', data);

将接口导入文件使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日本进口Hioki IM3536 LCR测试仪

Hioki IM3536 LCR测试仪 测量频率DC&#xff0c;4Hz~8MHz 测量时间&#xff1a;最快1ms 基本精度&#xff1a;0.05% rdg 1mΩ以上的精度保证范围&#xff0c;也可安心进行低阻测量 可内部发生DC偏压测量 从研发到生产线活跃在各种领域中 测量频率4Hz~8MHz&#xff0c;精度…

【pyq文案】可可爱爱、脑回路清奇の朋友圈文案

1.人每一个身体器官都是无价之宝&#xff0c;全部加起来1个月3000 2.别人出门&#xff1a;辣妹风、复古风、学院风&#xff1b;我出门&#xff1a;打工的勤劳小蜜蜂 3.看见自己就烦&#xff0c;50出&#xff1b;和今天星期四没关系 4.上学时拿钱混日子&#xff0c;上班后拿日…

种子轮、天使轮等相关知识

我们可以通过查询企业的相关工具网站&#xff0c;查看企业是否上市、独角兽、瞪羚企业、上市企业等情况。 转载&#xff1a; https://zhuanlan.zhihu.com/p/565389690 科创板挂牌不属于上市&#xff0c;企业在挂牌之后要经过协会核准后可以进行股份登记挂牌&#xff0c;大概需要…

【Redis】Redis 命令之 Hash

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型&#xff0c;也叫散列&#xff0c;其value是一个无序字典&#xff0c;类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储&#xff0c;当需要修改对象某个字段时很不方便&#xf…

java服务-常用技术-生僻函数、方法、技巧

一、字符串操作 1. 需要转义的字符 java字符串中需要转义的特殊字符1. \n 表示换行&#xff1b;2. \t 表示制表符&#xff0c;相当于Table键&#xff1b;3. \ 表示单引号&#xff1b;4. \" 表示双引号&#xff1b;5. \\ 表示一个斜杠“\”。 2. split第二个参数limit的用…

Dynamics 365 DevOps CI/CD之WebResource

对于D365自身的发布&#xff0c;简单点来说就是Solution的发布&#xff0c;复杂一些会涉及周边集成接口等一系列的发布。如果是单纯的Solution的发布的Azure DevOps商店里有很多工具&#xff0c;比如Power DevOps Tools&#xff0c;这个我之前也有博文转载过相关文章&#xff0…

史上最通俗易懂的EWMA(指数加权移动平均)的参数解释以及程序代码

文章目录 一、EWMA&#xff08;指数加权移动平均&#xff09;是什么&#xff1f;二、详细的参数解释3、使用Python pandas库中的ewm()函数实现指数加权移动平均&#xff08;EWMA&#xff09;的示例代码总结 一、EWMA&#xff08;指数加权移动平均&#xff09;是什么&#xff1f…

抢跑智驾AI芯片「新路径」

“胆量”这个词&#xff0c;被后摩智能创始人兼CEO吴强着重提及。 5月10日&#xff0c;后摩智能发布首款存算一体智驾芯片鸿途™H30&#xff0c;以12nm制程实现最高物理算力 256TOPS&#xff0c;典型功耗 35W&#xff0c;成为国内率先落地存算一体大算力 AI 芯片的公司。即&am…

多线程的最最简单的基本了解

引言&#xff1a; 在学习完常规的语法后&#xff0c;我们将进入下一步的学习&#xff0c;而多线程则是被大多数人认为的下一步的学习目标&#xff0c;因为在有了基础的语法大框架后我们都有了对编程的一个基本的认知&#xff0c;而多线程则是开始有了一定的深度。 一、线程的基…

企业电子招标采购系统源码之传统采购模式面临的挑战

采购类型多 采购制度&#xff1a;采购金额、部门、品类的差异导致管理标准不同。 采购流程&#xff1a;从供应商管理、寻源操作到合同签订、订单执行&#xff0c;业务流程长&#xff0c;审批节点多&#xff0c;传统管理透明度低&#xff0c;联动性差。 供应商管理难 寻源&#…

Aixcoder:AI辅助编程工具

【产品介绍】 aixcoder是一款基于深度学习人工智能技术的AI辅助编程工具。提供了一个由各个领域的专业代码训练出来的“虚拟编程专家”&#xff0c;通过与aixcoder进行结对编程&#xff0c;程序员可以感受到工作效率的显著提升。 借助aixcoder的帮助&#xff0c;程序员可以摆脱…

ChatGPT教程 基于Springboot+Spring+MybatisPlus实现gpt3.5接口开发

⛪ ChatGPT教程: 基于SpringbootSpringMybatisPlus实现gpt3.5接口开发 &#x1f680; 文章介绍: 本文基于SpringBootSpringMybatisPlus实现一个响应快速的gpt接口&#xff0c;可通过与前端整合开发对应的前端页面 &#x1f680; 源码获取: 项目中的资料可以通过文章底部小卡片获…

AutoSizer.exe:自动调整窗口大小的便捷工具

AutoSizer.exe是一款实用的桌面应用程序,它旨在帮助用户自动调整窗口大小,提供更好的用户体验。无论您是在使用Windows操作系统进行日常工作还是进行多任务处理,AutoSizer.exe可以简化您的工作流程,提高效率。本文将介绍AutoSizer.exe的下载地址、功能介绍、使用方法以及其…

国考省考行测:增长率,减少率,增长3倍,是3倍,比较增长率直接相除,能除就除,能减就减,看题三要素:时间,关键词,考点

国考省考行测&#xff1a;增长率&#xff0c;减少率&#xff0c;增长3倍&#xff0c;是3倍&#xff0c;比较增长率直接相除&#xff0c;能除就除&#xff0c;能减就减&#xff0c;看题三要素&#xff1a;时间&#xff0c;关键词&#xff0c;考点 2022找工作是学历、能力和运气…

__101对称二叉树------进阶:你可以运用递归和迭代两种方法解决这个问题吗?---本题还没用【迭代】去实现

101对称二叉树 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 101. 对称二叉树 https://leetcode.cn/problems/symmetric-tree/ 完成情况&#xff1a; 解题思路&#xff1a; 递归的难点在于&#xff1a;找到可以…

谈谈包装类与泛型

目录 包装类 基本数据类型与对应的包装类 装箱和拆箱 装箱 拆箱 泛型 什么是泛型 泛型的语法与使用 泛型的编译 擦除机制 泛型的上界 泛型方法 提到泛型的话&#xff0c;我们就先提一下包装类吧&#xff01; 包装类 在Java中&#xff0c;由于基本类型不是继承自Ob…

STC8单片机+基于DMP库解析MPU6050数据+匿名上位机图形化显示

STC8单片机+基于DMP库解析MPU6050数据+匿名上位机图形化显示 📌相关篇《STC8单片机+基于DMP库解析MPU6050数据+vofa+图形化显示》✨该工程代码匹配的是匿名四轴上位机软件的2.6版本通讯协议,所以支持使用2.6版本的,最新的版本不支持。🌿验证对象:STC8H8K64U🌿时钟频率…

产品需求文档|协调、协作和沟通新产品开发的专业指南

「产品需求文档」是一个强大的产品管理工具&#xff0c;被众多敏捷团队推荐&#xff0c;并被一些行业中的大公司使用。 它有助于使团队保持一致&#xff0c;促进长期合作&#xff0c;并向团队成员传达优先必做事项&#xff0c;以完成工作。 如果你还没有开始制作&#xff0c;…

一个有趣的vc1编码器

这里分享一个vc1编码器&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/weixin_43360707/87791898 文件包在附件&#xff0c;打开文件夹&#xff0c;可以看到下面三个文件夹&#xff1a; 因为我们的系统试Linux&#xff0c;所以我们选择Linux(x64). 继…

kubeadm方式搭建的k8s集群升级——2023.05

文章目录 一、概述二、集群概况三、升级集群2.1 确定升级版本2.2 升级Master2.3 升级 Worker 四、验证集群 一、概述 搭建k8s集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm&#xff0c;RKE&#xff08;Rancher&#xff09;等&#xff0c;k8s集群升级方式也各有…