Taro小程序配置网络请求

news/2025/2/12 15:07:19/

目录

  • 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");//返回一个Promisreturn chain.proceed(requestParams).then(res => {// console.log(res.statusCode, "res.statusCode");// 只要请求成功,不管返回什么状态码,都走这个回调switch (res.statusCode) {//404case config.NOT_FOUND:return Promise.reject({ desc: '请求资源不存在' });//502case config.BAD_GATEWAY:return Promise.reject({ desc: '服务端出现了问题' });//403case config.FORBIDDEN:return Promise.reject({ desc: '没有权限访问' });//401case config.AUTHENTICATE:return Promise.reject({ desc: '需要鉴权:' + config.AUTHENTICATE });//500case config.SERVER_ERROR:return Promise.reject({ desc: '服务器错误' });//200case 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;}}//返回出来的promiselet 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.ppmy.cn/news/71945.html

相关文章

众位力量汇集《永恒之塔私服》新版龙战前传

盛大游戏《永恒之塔》从万众翘首企盼中登陆国服到现在&#xff0c;已经过去了一年有余。在前不久前更新的周年庆版本“云上的召唤”中&#xff0c;精灵星的宝宝终于可以和精灵星一起翱翔在天际了…… “云上的召唤”我们还没有体验够&#xff0c;全新版本“龙战前传”已然于7月…

素雅的登录界面,简单而优雅

先上效果图&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*, *::after, *::before {margin: 0;padding: 0;box-sizing: bord…

【Mybatis】Mybatis处理一对多、多对多关系映射-四

唠嗑部分 上篇文章我们说了Mybatis中ORM映射的几种方式&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 这篇文章我们来说说Mybatis如何处理一对一、一对多、多对多的关系映射…

2023 Vue开发者的React入门

Vue 和 React 都是流行的 JavaScript 框架&#xff0c;它们在组件化、数据绑定等方面有很多相似之处 本文默认已有现代前端开发(Vue)背景&#xff0c;关于 组件化、前端路由、状态管理 概念不会过多介绍 0基础建议详细阅读 Thinking in React-官方文档 了解 React 的设计哲学 R…

C/C++趣味程序设计百例(71~80)

C/C语言经典、实用、趣味程序设计编程百例精解&#xff08;8&#xff09; 71.约瑟夫问题 这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事&#xff1a;15个教徒和15 个非教徒在深海上遇险&#xff0c;必须将一半的人投入海中&#xff0c;其余的人才能幸免于难…

MATLAB系列(2)——plot画图函数

一、plot plot画的是折线图。plot可以画出多种线类型的图&#xff0c;比如实线、虚线、星线、圆圈线等,一个图里可以画多条折线&#xff0c;方便对比。 1.1 设置坐标轴标签 和 图名 使用xlabel 和ylabel&#xff0c;title设置图名&#xff0c;fontsize设置名字字体大小 1.2 …

软件上线会面临哪些缺陷?这四种你一定很熟悉

上线对任何软件产品来说都是一件大事&#xff0c;确保一切正常并且向用户发布高质量的软件非常重要。劣质、过早、不稳定、难以使用的产品会产生大量经济损失&#xff0c;也可能使用户对品牌本身失去信任。一直以来&#xff0c;我们都说应该测试&#xff0c;应该将缺陷修复到可…

面试谎报了职级,本来是6,谎报成7,已经到HR这一步了,怎么了?

面试时谎报职级&#xff0c;公司能查出来吗&#xff1f; 一位网友说&#xff0c;自己在业务面时谎报了职级&#xff0c;把6报成7&#xff0c;现在已经到hr这一步了&#xff0c;该怎么办&#xff1f;是继续编吗&#xff1f; 有人不明白&#xff0c;为什么要谎报职级&#xff1f;…