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

相关推荐
suncentwl7 小时前
论答题pk小程序软件版权的
小程序·答题小程序·答题pk·知识竞赛·答题pk软件
weixin_hcs22017 小时前
小程序打通美团核销:解锁到店综合业态私域密码,赋能6000+门店破局增长
小程序·美团团购·美团新平台·java接入美团团购·快速接入美团团购
weixin_1772972206910 小时前
盲盒抽谷机小程序系统开发:解锁盲盒新玩法,开启潮玩社交新时代
小程序
2501_9159184114 小时前
iOS 文件管理全流程实战,从开发调试到数据迁移
android·ios·小程序·https·uni-app·iphone·webview
说私域2 天前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的运营策略创新研究
人工智能·小程序·开源
fakaifa2 天前
【最新版】沃德云商协系统全开源+uniapp小程序
小程序·uni-app·源码下载·沃德云商协会·商协会管理系统
说私域3 天前
基于梅特卡夫定律的开源链动2+1模式AI智能名片S2B2C商城小程序价值重构研究
人工智能·小程序·开源
2501_916013743 天前
移动端网页调试实战,跨设备兼容与触控交互问题排查全流程
android·ios·小程序·https·uni-app·iphone·webview
不如摸鱼去3 天前
uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?
前端·小程序·uni-app
说私域3 天前
生产工具革命:定制开发开源AI智能名片S2B2C商城小程序重构商业生态的范式研究
人工智能·小程序·开源