【小程序】封装网络请求request模块

一、封装request请求

因为我把所有项目中的接口也封装到了一个文件中,所以我建了一个services的文件夹,在下面建了一个request.js

在这个里面做了请求拦截器和响应拦截器,

javascript 复制代码
const apiConfig = require('../config/baseUrl.js');

class httpClient {
  prefixUrl = '';

  constructor(prefixUrl = '') {
    this.prefixUrl = prefixUrl
  }

  interceptors = {
    // 请求拦截器
    request: (params) => {
      if (params.showLoading) {
        // TODO: 封装loading
        tt.showLoading({
          "title": "加载中...",
          "mask": true,
        });
      }
      // 处理请求数据,如添加Header信息等,
      const config = {
        ...params,
        url: apiConfig.BASE_URL + this.prefixUrl + params.url,
        header: {
          ...params.header,
          'Content-type': 'application/json',
          //TODO: 后端需要的字段 
          // 'Access-Token': tt.getStorageSync('login.user.xxx')
        },
        timeout: 60000, // 超时时长,小程序默认是 1 分钟
      };

      if (config.method === 'GET') {
        config.url += '?' + Object.keys(config.data).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(config.data[key])}`).join('&');
      }
      return config;
    },
    // 响应拦截器
    response: (response) => {
      console.log('response', response)
      if (response.config.showLoading) {
        tt.hideLoading();
      }
      //TODO: 错误信息处理
      if (response.data.code && response.data.code !== 0 && response.data.code !== 200) {
        tt.showToast({
          title: response.data.message,
          duration: 2000,
          icon: "none",
          mask: false
        });
        return Promise.reject(response);
      }
      return response.data;
    }
  }

  request(config) {
    config = this.interceptors.request(config)

    // 网络请求
    return new Promise((resolve, reject) => {
      tt.request({
        ...config,
        success: (res) => {
          const mergeRes = Object.assign({}, res, {config})
          resolve(this.interceptors.response(mergeRes))
        },
        fail: (err) => {
          const mergeErr = Object.assign({}, err, {config})
          reject(this.interceptors.response(mergeErr))
        },

      });
    });
  }

  get(url, data = {}, config = {}, loading = true) {
    return this.request(Object.assign({ url, data, method: 'GET', showLoading: loading }, config))
  }

  post(url, data = {}, config = {}, loading = true) {
    return this.request(Object.assign({ url, data, method: 'POST', showLoading: loading }, config))
  }

  put(url, data = {}, config = {}, loading = true) {
    return this.request(Object.assign({ url, data, method: 'PUT', showLoading: loading }, config))
  }

  delete(url, data = {}, config = {}, loading = true) {
    return this.request(Object.assign({ url, data, method: 'DELETE', showLoading: loading }, config))
  }

}

module.exports = httpClient;

2、封装对应的 api 文件

在service的文件夹下面建了一个api.js【因为目前这个小程序页面比较少,暂定把所有接口写在同一个文件夹下】

javascript 复制代码
const httpClient = require('./request.js');

class ApiManager extends httpClient {
  constructor(){
    super('/api');
  }

  login(data) {
    return this.post('/login', data);
  }

  getData(data, config) {
    return this.get('/train_types', data, config);
  }
}

module.exports = new ApiManager();

3. 管理所有地址

javascript 复制代码
module.exports = {
  BASE_URL: 'http://192.168.2.68:1911',
}

4. 使用

javascript 复制代码
	const loginResponse = await ApiManager.login({
      user_name: 'admin',
      password:'hsradmin2022'
    })
    console.log('loginResponse', loginResponse)
    const response = await ApiManager.getData({}, {
      header: {
        'Access-Token': loginResponse.data.access_token,
      },
    });
    this.setData({
      list: response.data.list
    })
    console.log(response.data);

参考链接
https://www.npmjs.com/package/mina-request?activeTab=code

官方文档
https://open.feishu.cn/document/uAjLw4CM/uYjL24iN/block/api/network/request

相关推荐
一木 之林11 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
赵小哥要冲啦16 小时前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
河北清兮网络科技20 小时前
石家庄做一套企业知识库系统多少钱?2026 报价明细
小程序·短剧app·广告联盟
Ai-_Man21 小时前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
微订校园外卖平台1 天前
新手做校园外卖平台:小程序启动顺序与订单链路验收
小程序·外卖系统·本地生活·微订
FX1317887KP_2 天前
KET口语Part 2看图对话怎么练?“观察—提问—回应”;三步法讲透
小程序·ket口语·pet口语·fce备考·剑桥英语
沃达德软件2 天前
智慧教育教学资源管理系统(PC端+微信小程序)
微信小程序·小程序
阿俊-全栈开发2 天前
LikeShop 小程序商城首页可配置弹窗的设计与实现(Java + uni-app)
小程序·状态模式·likeshop·likeshop开源商城
考拉讲支付3 天前
延迟分账 / 核销分账的技术实现方案:服务完成后再分钱,到底怎么设计?
大数据·运维·人工智能·微信小程序·小程序·系统架构
Newway3213 天前
便利店小程序商城如何打通总部、门店与会员
小程序·小程序商城·会员运营·连锁便利店·门店订货·o2o系统