当前位置: 首页 > news >正文

微信小程序网络请求封装

微信小程序的网络请求为什么要封装?封装使用有什么好处?

封装的目的是为了偷懒,试想一下每次都要wx.request,巴拉巴拉传一堆参数,是不是很麻烦,有些公共的参数例如header,baseUrl是不是可以封装起少些一些代码。

同时也是为了避免回调地狱,例如一个请求要依赖于上一个请求的回调结果,那么我们就需要嵌套。这样一层一层的嵌套不利于代码维护。

综上就写个封装吧(我的就是简单封装了下,没有参照大神们的复杂封装,我就是为了单纯请求时候想少些几个参数)....

1.新建request.js文件

class WxRequest{
  constructor(){

  }
  defaults={
    baseUrl:'http://36.137.4.235:8080',
    header:{
      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",
      Authorization:"",
    }
  }
  interceptors={
    request:(config)=>{
      return config;
    },
    response:(response)=>{
      return response;
    }
  }
  request(options){
    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJtWFFhSEhZa01DQ3NuYkNpZmozWjNLN3dOaFZVRDdEMCIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.qfyBJcuu5mEdxKzT3vkvPXxZOgbiHMvmvhEi2IiNpFE";
    this.defaults.header.Authorization="Bearer " + access_token
    options.url=this.defaults.baseUrl + options.url;
    options={...this.defaults,...options}
    return new Promise((resolve,reject)=>{
      wx.request({
        ...options,
        success:(res)=>{
          resolve(res)
        },
        fail:(err)=>{
          reject(err)
        }
      })
    })
  }
}

const instance = new WxRequest();
instance.interceptors.request=(config)=>{
  return config;
}
instance.interceptors.response=(response)=>{
  return response;
}
export default instance;

 上面我们就创建好了一个request.js文件,并且里面创建了一个Wx.Request类。并且实例化了一下。

下面我们看一下如何调用这个我们创建的实例化对象

 1.用request.js文件并且使用

import instance from "../../utils/request"

Page({

onLoad: function (options) {

    this.getList();

  },

  async getList(){

    let res = await instance.request({

      url:'/desktop/icon/list',

      method:"GET",

      data:{

        pageSize:"10",

        pageNum:"1",

        isAsc:"desc"

      }

    })

    console.log(res)

  

  },

})

 以上就是一个简单的封装方法,复制粘贴就能用。

里面有个问题,如何不写入async 和await 会这么么样?

没错,时返回一个promise对象。

2.完善请求-statusCode状态码

其实方法里面还有一些问题,这个问题就是,在小程序中,只要服务端返回了结果,就会进入到小程序的success中,那么当服务器返回的结果是401或者是500等结果,也同样进入到了success中,因此上述中就缺少了相关返回结果的判断,下面代码中我们加入statusCode的判断来完善风封装的请求。

我是直接写在了wx.request里面用 switch case 来判断的,你也可以写在别的地方。例如写在拦截器请求拦截器和响应拦截器中,我是觉得我开始参数合并、修改啥的都写在了方法里面,我就依旧在wx.request里面来写就算了。

class WxRequest{

  constructor(){

  }

  defaults={

    baseUrl:'http://36.137.4.235:8080',

    header:{

      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",

      Authorization:"",

    }

  }

  interceptors={

    request:(config)=>{

      return config;

    },

    response:(response)=>{

      return response;

    }

  }

  request(options){

    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJjOFJHelNVQ3RjMGVhWkJxV1VzY3lEb2V4T0dMbXB0ZiIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.sacBfJ8qPOEICfFTpbxgRaQN2A368rZITV6_jwB4_-Y";

    this.defaults.header.Authorization="Bearer " + access_token

    options.url=this.defaults.baseUrl + options.url;

    options={...this.defaults,...options}

    return new Promise((resolve,reject)=>{

      wx.request({

        ...options,

        success:(res)=>{

          switch (res.data.code) {

            case 200:

              return resolve(res.data)

            case 401:

             wx.showModal({

              title: '系统提示',

              content: '登陆过期,请重新登录',

              showCancel:false,

              success (modalres) {

                if (modalres.confirm) {

                  console.log('用户点击确定');

                }

              }

             })

             return Promise.reject(res)

            default:

              wx.showToast({

                title: '系统更新中...',

                duration:3000

              })

              return Promise.reject(res)

        }

          

        },

        fail:(err)=>{

          reject(err)

        }

      })

    })

  }

}

const instance = new WxRequest();

instance.interceptors.request=(config)=>{

  return config;

}

instance.interceptors.response=(response)=>{

  return response;

}

export default instance;

2.使用的话参照之前1.使用就行了,没啥大变化。

3.封装更加便捷的方法

大家在用的时候,有没有发现,每次请求虽然比之前简单了,但是还是不够简单。下面我们利用request这个定义的方法,在创建几个更快捷的请求方法。 

class WxRequest{

  constructor(){

  }

  defaults={

    baseUrl:'http://36.137.4.235:8080',

    header:{

      clientid:"e5cd7e4891bf95d1d19206ce24a7b32e",

      Authorization:"",

    },

    method:"GET",

    data:null

  }

  interceptors={

    request:(config)=>{

      return config;

    },

    response:(response)=>{

      return response;

    }

  }

  request(options){

    let access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJjOFJHelNVQ3RjMGVhWkJxV1VzY3lEb2V4T0dMbXB0ZiIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.sacBfJ8qPOEICfFTpbxgRaQN2A368rZITV6_jwB4_-Y";

    this.defaults.header.Authorization="Bearer " + access_token

    options.url=this.defaults.baseUrl + options.url;

    options={...this.defaults,...options}

    return new Promise((resolve,reject)=>{

      wx.request({

        ...options,

        success:(res)=>{

          switch (res.data.code) {

            case 200:

              return resolve(res.data)

            case 401:

             wx.showModal({

              title: '系统提示',

              content: '登陆过期,请重新登录',

              showCancel:false,

              success (modalres) {

                if (modalres.confirm) {

                  console.log('用户点击确定');

                }

              }

             })

             return Promise.reject(res)

            default:

              wx.showToast({

                title: '系统更新中...',

                duration:3000

              })

              return Promise.reject(res)

        }

          

        },

        fail:(err)=>{

          reject(err)

        }

      })

    })

  }

  get(url,data){

    return this.request({url:url,method:"GET",data:data})

  }

 post(url,data){

    return this.request({url:url,method:"POST",data:data})

  }

 put(url,data){

    return this.request({url:url,method:"PUT",data:data})

  }

 delete(url,data){

    return this.request({url:url,method:"DELETE",data:data})

  }

}

const instance = new WxRequest();

instance.interceptors.request=(config)=>{

  return config;

}

instance.interceptors.response=(response)=>{

  return response;

}

export default instance;

 

3.引用request.js文件并且使用新的快捷方法

import instance from "../../utils/request"

Page({

onLoad: function (options) {

    this.getList();

  },

  async getList(){

    let data = {

        pageSize:"10",

        pageNum:"1",

        isAsc:"desc"

      }

    let res = await instance.get('/desktop/icon/list',data)

    console.log(res)

  },

})

这样是不是更简单了....哈哈哈哈 


http://www.mrgr.cn/news/90536.html

相关文章:

  • AI-Engine-Direct-Helper 快速上手及环境配置
  • linux运行kettle 遇到问题汇总
  • 自然语言处理NLP入门 -- 第二节预处理文本数据
  • fps动作系统9:动画音频
  • 【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
  • django中间件,中间件给下面传值
  • 使用mermaid画流程图
  • 【核心特性】从鸭子类型到Go的io.Writer设计哲学
  • 企语企业管理系iFair(F23.2_a0)在Debian操作系统中的安装
  • C++基础学习记录—this指针和const关键字
  • mysql8.0使用MGR实现高可用
  • Linux内核 - 非仿生机器人之感知主控系统(协议栈)
  • android studio下载安装汉化-Flutter安装
  • 并发编程---多线程不安全示例以及解决,多线程创建方式
  • 【嵌入式Linux应用开发基础】read函数与write函数
  • 【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞
  • 自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF
  • haproxy+nginx负载均衡实验
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • DeepSeek-V3 技术报告