Taro小程序配置网络请求

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);

将接口导入文件使用。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Taro 钉钉小程序是一种基于 Taro 框架开发的小程序应用,它提供了丰富的开发工具和组件库,帮助开发者更高效地构建小程序应用。其中,饼图是 Taro 钉钉小程序中常用的一种数据可视化图表。 饼图通常用于展示数据的比例关系,并帮助用户更直观地理解数据的分布情况。在 Taro 钉钉小程序中使用饼图可以通过引入相应的组件库来实现。开发者可以使用这些组件库提供的饼图组件,传入相应的数据和样式参数,即可在小程序中呈现出漂亮的饼图。 Taro 钉钉小程序饼图组件通常具备一些常见的功能和特性,比如支持设置饼图的大小、颜色、标签等。开发者可以根据实际需求,调整这些参数以得到适合自己应用场景的饼图。 获取数据通常是开发饼图的重要一步。在 Taro 钉钉小程序中,可以通过调用接口或者请求后台接口来获取数据,并将数据传入饼图组件进行展示。数据可以是一个数组,每个元素代表一个数据项,包括数据的值和对应的标签。 饼图常用于展示数据的占比和比例关系,因此对于大数据量的饼图,可以使用数据筛选和排序等方式来优化展示效果。此外,还可以添加动画效果来提升用户体验,让饼图更具吸引力。 总的来说,Taro 钉钉小程序饼图是一种在小程序中常用的数据可视化图表,通过引入相应的组件库,开发者可以方便地创建自定义的饼图,并展示数据的比例关系,从而让用户更好地理解和分析数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值