uni-app封装网络请求(下)

2,607 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

接文章uni-app封装网络请求(上),本篇主要解释如何详细封装网络请求。

前提

Promise是一种常用的异步解决方案,解决回调地狱的问题。有了Promise对象,就可以将异步操作以同步的操作的流程表达出来,避免了层层嵌套的回调函数。

uni-app中uni.request()可以发送异步网络请求。实际开发时我们使用本地的请求地址,而在项目上线时会使用线上的地址,并且每个请求所含的参数和请求方式都不大相同,那么在开发时就可以使用Promise对请求进行封装。

简单实现

文章封装网络请求(上)已经讲述了关于请求配置config的一些内容,下面主要讲述request的配置:

  • options 对请求参数的封装,主要包含内容可以参考官网对于uni.request(OBJECT)中的参数配置。

  • Promise 网络请求,发送请求过程中的操作,下面主要是纯净版的发送请求。

request(options) {
        if(!options) {
                options = {}
        }
        options.baseUrl = options.baseUrl || this.config.baseUrl
        options.dataType = options.dataType || this.config.dataType
        options.url = options.baseUrl + options.url
        options.data = options.data || {}
        options.method = options.method || this.config.method

        //基于Promise 的网络请求
        return new Promise((resolve, reject) => {
                uni.showLoading({
                        title:'加载中...'
                });
                let _config = null
                // 请求完成时的操作
                options.complete = (response) => {
                        uni.hideLoading();
                        let statusCode = response.statusCode
                        response.config = _config
                        if(process.env.NODE_ENV === 'development') {
                                if(statusCode === 200) {
                                        // 对返回数据做预处理
                                } 
                        }


                }
                // 将请求配置和请求参数放到目标对象_config中去
                _config = Object.assign({}, this.config, options)  
                console.log('test',_config)
                uni.request(_config);  // uni-app请求方法使用

        })	
}

返回状态码不同情况的处理

有些情况下,前端发送的请求,后台因为某些情况会有不同的状态返回,为了给用户更好的体验,通常我们要针对不同情况做合理的处理。比如:当请求返回400请求报文存在语法错误时,需要告知用户需要 reLaunch 到登录页。

let { code, msg } = response.data   // 假设后台返回的数据格式是这样的

// 不同状态码,提示不同的错误,这里需要要后台人员沟通商定。
if (response.data.code == 400) {
        setTimeout(() => {
                uni.reLaunch({
                        url: '/pages/public/login'
                })
        }, 1000)
        reject(response)
} else if (code == 0) {
        tool.msg(msg)
        resolve(response.data)
} else {
        resolve(response.data)
}

统一接口管理

在api文件夹下新建index.js文件, 统一存放接口地址, 以方便后期维护。具体代码如下:

import http from './request'
const apiList = {
        // 接口地址
        postList: (data) => {
            return http.request({
                url:'/posts',
                method: 'GET',
                data
        })
    }
}

export default apiList

具体使用

结合 uni-app封装网络请求(上),具体使用方法如下:

- 在main.js中引入

import api from '@/api' 
Vue.prototype.$api = api

import global from './api/global.js'
Vue.prototype.global = global

- 页面 index.vue中使用

onLoad() {
       this.loadList()
},
methods: {
    loadList() {
            this.$api.postList().then(res => {
                    console.log('test',res)
            }).catch(err => {
                    console.log(err)
            })
    }
}

- 效果

可以在调试器network中看到发送的请求。

QQ截图20211108150724.png