uniapp的请求封装(含post ,get,put ,delete)

男娘i 2023-02-17 02:16 59阅读 0赞

最近使用uniapp写小程序,但是没有合适的数据请求,于是自己熬夜写了一个。
这是对应代码的下载链接
也可以直接找我要代码
下面是对于代码的解释:

  1. 请求的初步封装

    export default class request {

    1. // 配置项
    2. constructor(options) {
    3. //请求公共地址
    4. this.baseUrl = options.baseUrl || "";
    5. //公共文件上传请求地址
    6. this.fileUrl = options.fileUrl || "";
    7. //默认请求头
    8. this.header = options.header || { };
    9. //默认配置
    10. this.config = {
    11. // 这是对于接口的错误是否提示
    12. isPrompt: options.isPrompt === false ? false : true,
    13. // 是否加载动画提示
    14. load: options.load === false ? false : true,
    15. // 是否需要token
    16. needToken: options.needToken === false ? false : true,
    17. // 公共数据的处理
    18. isFactory: options.isFactory === false ? false : true,
    19. loadMore: options.loadMore === false ? false : true
    20. };
    21. }
    22. // 获取默认信息
    23. getDefault(data, options = { }) {
    24. //判断url是不是链接
    25. let urlType = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/.test(data.url);
    26. let config = Object.assign({ }, this.config, options, data);
    27. if (data.method == "FILE") {
    28. config.url = urlType ? data.url : this.fileUrl + data.url;
    29. } else {
    30. config.url = urlType ? data.url : this.baseUrl + data.url;
    31. }
    32. //请求头
    33. if (options.header) {
    34. config.header = Object.assign({ }, this.header, options.header);
    35. } else if (data.header) {
    36. config.header = Object.assign({ }, this.header, data.header);
    37. } else {
    38. config.header = this.header;
    39. }
    40. return config;
    41. }
    42. //post请求
    43. post(url = '', data = { }, options = { }) {
    44. return this.request({
    45. method: "POST",
    46. data: data,
    47. url: url,
    48. ...options
    49. });
    50. }
    51. //get请求
    52. get(url = '', data = { }, options = { }) {
    53. return this.request({
    54. method: "GET",
    55. data: data,
    56. url: url,
    57. ...options
    58. });
    59. }
    60. //put请求
    61. put(url = '', data = { }, options = { }) {
    62. return this.request({
    63. method: "PUT",
    64. data: data,
    65. url: url,
    66. ...options
    67. });
    68. }
    69. //delete请求
    70. delete(url = '', data = { }, options = { }) {
    71. return this.request({
    72. method: "DELETE",
    73. data: data,
    74. url: url,
    75. ...options
    76. });
    77. }
    78. //接口请求方法
    79. request(data) {
    80. const _this = this;
    81. return new Promise((resolve, reject) => {
    82. if (!data.url) {
    83. console.log("request缺失数据url");
    84. reject({
    85. errMsg: "缺失数据url",
    86. statusCode: 0
    87. });
    88. return;
    89. }
    90. let requestInfo = this.getDefault(data);
    91. //请求前回调
    92. if (_this.requestStart) {
    93. let requestStart = this.requestStart(requestInfo);
    94. if (typeof requestStart == "object") {
    95. requestInfo.data = requestStart.data;
    96. requestInfo.header = requestStart.header;
    97. requestInfo.isPrompt = requestStart.isPrompt;
    98. requestInfo.needToken = requestStart.needToken;
    99. requestInfo.load = requestStart.load;
    100. requestInfo.isFactory = requestStart.isFactory;
    101. } else {
    102. //请求完成回调
    103. _this.requestEnd && _this.requestEnd(requestInfo, {
    104. errMsg: "请求开始拦截器未通过",
    105. statusCode: 0
    106. });
    107. reject({
    108. errMsg: "请求开始拦截器未通过",
    109. statusCode: 0
    110. });
    111. return;
    112. }
    113. }
    114. let requestData = {
    115. url: requestInfo.url,
    116. header: requestInfo.header, //加入请求头
    117. success: (res) => {
    118. //请求完成回调
    119. this.requestEnd && this.requestEnd(requestInfo, res);
    120. //是否用外部的数据处理方法
    121. if (requestInfo.isFactory && this.dataFactory) {
    122. //数据处理
    123. this.dataFactory({
    124. ...requestInfo,
    125. response: res,
    126. resolve: resolve,
    127. reject: reject
    128. });
    129. } else {
    130. resolve(res);
    131. }
    132. },
    133. fail: (err) => {
    134. console.log("err");
    135. //请求完成回调
    136. this.requestEnd && this.requestEnd(requestInfo, err);
    137. reject(err);
    138. }
    139. };

    }

  2. 跟地址,token的配置,请求拦截和响应拦截

    import request from “./request”;
    // 全局配置的请求域名
    let baseUrl = “http://sunshine.createnetwork.cn/api/“;
    //可以new多个request来支持多个域名请求
    let $http = new request({

    1. //接口请求地址
    2. baseUrl: baseUrl,
    3. //设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致)
    4. header: {
    5. 'content-type': 'application/json;charset=UTF-8'
    6. },
    7. //以下是默认值可不写
    8. //是否提示--默认提示
    9. isPrompt: true,
    10. // 1 请求是否带token 默认带token
    11. needToken: true,
    12. //是否显示请求动画
    13. load: true,
    14. //是否使用处理数据模板
    15. isFactory: true

    });

  1. //当前接口请求数
  2. let requestNum = 0;
  3. //请求开始拦截器
  4. $http.requestStart = function(options) {
  5. if (options.load) {
  6. if (requestNum <= 0) {
  7. //打开加载动画
  8. uni.showLoading({
  9. title: '加载中',
  10. mask: true
  11. });
  12. }
  13. requestNum += 1;
  14. }
  15. if (options.needToken){
  16. //请求前加入token
  17. if(options.needToken){
  18. }
  19. // 这个是异步获取token 应该是同步获取
  20. // let token =""
  21. // uni.getStorage({
  22. // key: 'Authorization',
  23. // success: function (res) {
  24. // console.log(res.data,6);
  25. // token = res.data
  26. // }
  27. // });
  28. const token = uni.getStorageSync('Authorization');
  29. if (!token) {
  30. console.log(token,6);
  31. if (options.needToken) {
  32. // uni.reLaunch({
  33. // // 如果没有token就转跳到登入页面
  34. // url: '../pages/login/logi'
  35. // });
  36. // return false;
  37. uni.showModal({
  38. title: '温馨提示',
  39. content: '此时此刻需要您登录喔~',
  40. confirmText: "去登录",
  41. cancelText: "再逛会",
  42. success: res2 => {
  43. loginPopupNum--;
  44. if (res2.confirm) {
  45. uni.navigateTo({
  46. url: "../../pages/login/login"
  47. });
  48. }
  49. }
  50. });
  51. }
  52. }
  53. // 请求头中配置token
  54. options.header['Authorization'] = 'Bearer ' + token
  55. }
  56. return options;
  57. }
  58. //请求结束 响应拦截
  59. $http.requestEnd = function(options, resolve) {
  60. //判断当前接口是否需要加载动画
  61. if (options.load) {
  62. requestNum = requestNum - 1;
  63. if (requestNum <= 0) {
  64. uni.hideLoading();
  65. }
  66. }
  67. if (resolve.errMsg && resolve.statusCode && resolve.statusCode > 300) {
  68. setTimeout(() => {
  69. uni.showToast({
  70. title: "网络错误,请检查一下网络",
  71. icon: "none"
  72. });
  73. }, 500);
  74. }
  75. // if()
  76. }
  77. //登录弹窗次数
  78. let loginPopupNum = 0;
  79. //所有接口数据处理(可在接口里设置不调用此方法)
  80. //此方法需要开发者根据各自的接口返回类型修改,以下只是模板
  81. $http.dataFactory = function(res) {
  82. console.log("接口请求数据", {
  83. httpUrl: res.url,
  84. resolve: res.response,
  85. header: res.header,
  86. data: res.data,
  87. method: res.method,
  88. });
  89. // 判断接口请求是否成功
  90. console.log(res.response.statusCode,10);
  91. if (res.response.statusCode || res.response.statusCode == 200) {
  92. let httpData = res.response.data;
  93. console.log(httpData.success);
  94. //判断数据是否请求成功
  95. if (res.response.statusCode == 200 || res.response.statusCode == 201) {
  96. // 返回正确的结果(then接受数据)
  97. res.resolve(httpData);
  98. console.log(res.response.statusCode,res.resolve(httpData.data));
  99. } else if (res.response.statusCode == 401 || res.response.statusCode == 403) {
  100. // 对401 403的处理
  101. // 刷新token
  102. $http.put('authorizations/current').
  103. then(function (response) {
  104. //这里只会在接口是成功状态返回
  105. // 返回成功再次存储 token数据
  106. uni.setStorageSync('Authorization', response);
  107. }).catch(function (error) {
  108. //这里只会在接口是失败状态返回,不需要去处理错误提示
  109. console.log(error);
  110. });
  111. // 返回错误的结果(catch接受数据)
  112. res.reject(res.response);
  113. } else { //其他错误提示
  114. if (res.isPrompt) { //设置可以提示的时候
  115. setTimeout(function() {
  116. uni.showToast({
  117. // title: httpData.info, //提示后台接口抛出的错误信息
  118. title: httpData.info,
  119. icon: "none",
  120. duration: 3000
  121. });
  122. }, 500);
  123. }
  124. // 返回错误的结果(catch接受数据)
  125. res.reject(res.response);
  126. }
  127. } else {
  128. // 返回错误的结果(catch接受数据)
  129. res.reject(res.response);
  130. }
  131. };
  132. export default $http;

发表评论

表情:
评论列表 (有 0 条评论,59人围观)

还没有评论,来说两句吧...

相关阅读