uniapp 网络请求封装(uni.request 与 uView-Plus)

本文介绍了在Vue3项目中如何通过env.js管理开发和生产环境的API地址,并提供了uni.request和uview-plus的请求封装示例,包括请求头设置、拦截和错误处理,以及如何在页面中调用封装后的接口。

一、背景

在开发项目中,需要经常与后端服务器进行交互;为了提高开发效率和代码维护性,以及降低重复性代码,便对网络请求进行封装统一管理。

二、创建环境文件

2.1、根目录新建utils文件夹,utils文件夹内新建env.js文件

2.2、env.js文件

let BASE_URL
//开发环境中
if (process.env.NODE_ENV === 'development') {
  // 开发环境
  BASE_URL = 'http://xxxx'  //开发环境请求地址
} else {
  // 生产环境
  BASE_URL = 'https://xxxx'  //生成环境请求地址
}

export default BASE_URL

⭐⭐说明:

创建的是vue3项目,与vue2项目的区别在于页面中调用api的写法不同,具体以需求为主

以下是两种uniapp请求的封装,分别为👇👇:

①uni.request 请求封装,②uniapp+uview-plus 请求封装

✍✍两种请求封装,根据需求二选一,不能同时使用

三、uni.request 请求封装(方法一)

3.1、官网地址👉:uni.request(OBJECT) | uni-app官网

3.2、在utils文件夹下创建request.js文件,用于封装请求

备注:在发送uni.request请求之前,可以执行拦截操作;在uni.request的success中接收响应后处理响应数据

import BASE_URL from '@/env.js' //引入接口共用地址
import useUserStore from '@/store/user.js' //引入仓库,使用的是pinia
export const request = (options) => {
  return new Promise((resolve, reject) => {
    // 获取用户令牌
    let token = useUserStore().token
    // 设置请求头
    const header = {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${token}`,
      ...options.header // 可以传入额外的请求头参数
    }
    // ⭐在发送请求之前执行拦截操作
    uni.request({
      url: BASE_URL + options.url, //接收请求的API
      method: options.method || 'GET', //接收请求的方式,如果不传默认为GET
      data: options.data || {}, //接收请求的data,不传默认为空
      header: header, //接收请求的header
      success(res) {
        // ⭐在这里处理接收到响应后处理响应数据
        if (res.data.code != 0) {
          // 提示重新登录
          uni.$showMsg('请登录')
          useUserStore().userLogout()
          setTimeout(() => {
            uni.switchTab({
              url: '/pages/my/my'
            })
          }, 1000)
        }
        resolve(res.data) // 使用resolve将数据传递出去
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

3.3、在utils文件夹下创建api.js文件

api.js文件是用来调用封装好的uni.request,统一管理请求接口,在后续开发中只需要调用api.js文件即可

import {request} from './request.js' //导入封装好的js文件

//登录  post请求
export const login = (data)=>{
  return request({
    url:'wx-api/login',
    method:'post',
    data:data
  })
}

//用户信息  get请求 
export const info = ()=>{
  return request({
    url:'/wx-api/me/info',
  })
}

3.4、页面调用api文件使用

<script setup>
import { login } from '@/utils/api.js'
//点击登录按钮操作
const getToken = async () => {
  let res = await login()
  console.log('res', res)
}
</script>

四、uniapp+uview-plus 请求封装(方法二)

4.1、前提条件:项目中引入uview-plus

具体操作可查看之前写的文章👉uniapp使用 uview-plus 和 Pinia(vue3项目)_翻滚的露西的博客-CSDN博客

uview-plus官网地址👉: Http请求 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

4.2、 在utils文件夹下创建request.js文件,用于封装请求

在此可以书写请求和响应拦截

import BASE_URL from '@/env.js' //引入接口共用地址
import useUserStore from '@/store/user.js' //引入仓库,使用的是pinia
export const setRequestConfig = () => {
  uni.$u.http.setConfig((config) => {
    /* config 为默认全局配置*/
    config.baseURL = BASE_URL
    return config
  })
  // 请求拦截
  uni.$u.http.interceptors.request.use(
    (config) => {
      let token = useUserStore().token
      if (token) {
        config.header.Authorization = `Bearer ${token}`
      }
      return config
    },
    (error) => {
      return Promise.reject(error)
    }
  )
  // 响应拦截
  uni.$u.http.interceptors.response.use(
    (response) => {
      if (response.data.code == 401) {
        // 提示重新登录
        uni.$showMsg('请登录')
        useUserStore().userLogout()
        setTimeout(() => {
          uni.switchTab({
            url: '/pages/my/my'
          })
        }, 1000)
      }
      return response
    },
    (error) => {
      return Promise.reject(error)
    }
  )
}

4.3、在utils文件夹下创建api.js文件

api.js文件是用来调用uview-plus封装好的请求,统一管理请求接口,在后续开发中只需要调用api.js文件即可

import { setRequestConfig } from './request.js';

// 调用setRequestConfig函数进行请求配置
setRequestConfig();
const http = uni.$u.http
// 发起登录请求   post请求
export const requestLogin = (data) => http.post('/wx-api/login', data);
//获取个人中心信息  get请求
export const requestUserInfo = () => http.get('/wx-api/me/info')

4.4、页面调用api文件使用

<script setup>
import { requestLogin } from '@/utils/api.js'
//点击登录按钮操作
const getToken = async () => {
  let res = await requestLogin()
  console.log('res', res)
}
</script>

最后:👏👏😊😊😊👍👍 

### 全局注册 uView-Plus 组件库的其他组件 在 UniApp 项目中全局注册 uView-Plus 的其他组件,可以通过配置 `easycom` 自动引入机制来实现。这种方式允许开发者在不手动注册的情况下直接使用组件库中的组件,从而简化开发流程并提升效率。 在 `pages.json` 文件中,需要配置 `easycom` 规则以支持 uView-Plus 组件的自动引入。具体配置如下: ```json { "easycom": { "custom": { "^u--(.*)": "uview-plus/components/u-$1/u-$1.vue", "^up-(.*)": "uview-plus/components/u-$1/u-$1.vue", "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue" } } } ``` 通过上述配置,可以在任意页面中直接使用 uView-Plus 提供的组件,例如 `u-button`、`u-input` 等,而无需在每个页面中单独引入和注册组件 [^2]。 此外,如果希望在项目入口文件 `main.js` 中进一步集成 uView-Plus,可以使用以下方式引入整个组件库: ```javascript import uviewPlus from '@/uni_modules/uview-plus'; const app = new Vue({ store, render: h => h(App) }); app.use(uviewPlus); ``` 同时,在全局样式文件中引入 uView-Plus 的主题样式,以确保所有组件的外观一致: ```scss /* uni.scss */ @import '@/uni_modules/uview-plus/theme.scss'; ``` 并且在 `App.vue` 文件中引入主样式文件: ```scss <style lang="scss"> @import "@/uni_modules/uview-plus/index.scss"; </style> ``` 这些步骤完成后,uView-Plus 的所有组件都可以在项目中全局使用,无需额外的引入或注册操作 。 ### 使用全局组件 完成全局注册后,可以直接在页面中使用 uView-Plus 的组件。例如,使用 `u-button` 创建一个按钮,并绑定点击事件以触发某些功能: ```vue <template> <view> <u-button @click="onClick">点击我</u-button> </view> </template> <script> export default { methods: { onClick() { // 触发点击事件 console.log('按钮被点击'); } } }; </script> ``` ### 配置注意事项 - 确保 `easycom` 的规则正确无误,并且组件路径实际安装的 uView-Plus 版本匹配。 - 如果在使用过程中遇到组件不生效的问题,检查是否遗漏了 `easycom` 的配置或者组件路径是否正确 。 - 在某些情况下,可能需要重新启动开发服务器以确保所有配置生效。 ### 其他功能集成 除了组件的全局注册外,uView-Plus 还提供了一些实用工具和功能模块,如网络请求封装、数据存储等。这些功能可以通过引入相应的模块来实现: ```javascript import { http } from '@/uni_modules/uview-plus'; http.interceptors.request.use((config) => { // 请求拦截逻辑 return config; }, (config) => { // 错误处理 return Promise.reject(config); }); ``` 这种集成方式使得开发者能够在项目中轻松使用 uView-Plus 提供的各种功能,进一步提升开发效率和用户体验 [^3]。 ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值