【小程序】封装网络请求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

相关推荐
mg66818 分钟前
微信小程序入门实例_____打造你的专属单词速记小程序
微信小程序·小程序
程序员陆通26 分钟前
Vibe Coding开发微信小程序实战案例
微信小程序·小程序·notepad++·ai编程
「、皓子~1 小时前
后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
前端·人工智能·微服务·小程序·go·ai编程·ai写作
nbsaas-boot1 小时前
[特殊字符] 分享裂变新姿势:用 UniApp + Vue3 玩转小程序页面分享跳转!
小程序·uniapp·notepad++
老A技术联盟1 小时前
从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析
前端·小程序
you45801 小时前
小程序学习笔记:使用 MobX 实现全局数据共享,实例创建、计算属性与 Actions 方法
笔记·学习·小程序
风铃喵游1 小时前
构建引擎: 打造小程序编译器
前端·小程序·架构
说私域1 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的抖音渠道力拓展与多渠道利润增长研究
人工智能·小程序·开源
MonkeyKing_sunyuhua3 小时前
微信小程序能不能获取物联网的上的设备数据
物联网·微信小程序·小程序
paopaokaka_luck3 小时前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序