Skip to content

uniapp-请求封装

uniapp之中可以使用两种请求(axios请求/uni.request请求)

接下来我们就开始依次递进我们整个项目的开发,项目中最重要的就是对于接口的请求,接下来我们就简单封装一下接口,在后续的开发中,我们就可以直接使用我们的接口进行开发了

我们先来看看uni.request与axios的选择和比较

1、uni.request/axios选择比较

(1)简单介绍

我们先来看一个问题

uniapp之中能否使用axios

vue是uniapp的主要框架之一,而axios是vue中最受欢迎的http库。所以uniapp中肯定能使用vue的axios

uniapp中请求接口广受欢迎的方式有两种

js
+  uni.request 
+  axios

虽然Uniapp内置了uni.request网络请求API,但是开发者也可以使用Vue的Axios。两者都具有各自的优劣势,开发者可以根据实际情况选择使用哪一个。

(2)相同和区别

相似点

  • Uniapp之中内置了一个名为uni.request的网络请求API,与Vue的Axios十分相似。

  • 两者都支持请求拦截、响应拦截等功能,uni.request的调用方式与axios也非常类似。

  • Uniapp使用的是Promise封装的异步请求方式,而Axios则使用Promise,当然,也可以可选用async/await。

区别

  • Vue的Axios默认使用JSON格式进行数据传输

  • Uniapp的uni.request默认使用form表单方式进行数据传输。

    🤫 这里需要注意: 想在Uniapp中使用Vue的Axios,并且希望使用JSON格式进行数据传输,需要在请求头中设置Content-Type为application/json。

  • Vue的Axios可以通过设置baseURL来设置请求的基础路径,而Uniapp的uni.request只能通过在调用时手动指定请求路径。也可以通过使用uni-app的manifest.json文件中的配置来解决。

  • Vue的Axios中可以设置全局拦截器,达到在请求前或者响应后进行相应操作的功能。而Uniapp的uni.request只能在每个请求中单独设置拦截器,需要多次配置。

2、uni.request认识使用

对于uni.request请求不熟悉的我们先简单来认识一下uni.request请求的使用

uni.request可以用来发送各种类型的 HTTP 请求,如 GET、POST 等,并且支持异步操作

我们先来看一下基础的请求和使用,然后再根据在实际需求中的对于请求过程进行整个封装和进阶使用

uni.request的使用跟我们axios的请求差不多,以我们的GET请求和POST请求为案例:

GET请求

javascript
uni.request({
       url: 'http://localhost:8888/api/user', // 替换为你的接口地址
       method: 'GET',
       success: (res) => {
         console.log(res.data);
       },
       fail: (err) => {
         console.error('请求失败', err);
       },
});

POST请求

javascript
uni.request({
     url: 'http://localhost:8888/api/login',
     method: 'POST',
     data: {
       username: 'xxx',
       password: 'xxx',
     },
     success: (res) => {
       console.log('登录成功', res.data);
       // 这里可以处理登录成功后的逻辑
     },
     fail: (err) => {
       console.error('登录失败', err);
       // 处理登录失败的情况
     },
});

3、uni.request简单封装

☞ 在根目录下面 新建 => utils📂/config.js

这个文件夹📂下面就是为了放置我们对于整个项目的设置,主要就是我们的接口请求前缀,方便修改

js
const baseURL='http://localhost:8888';
export default baseURL;

☞ 在根目录下面 新建 => utils📂/request.js

在这里我们先对于request进行一个简单的请求封装,这个过程就是为我们的接口请求过程塞进去一个认证的Token

思路:

简单封装一下我们的uni.request请求

利用uni.getStorageSync('token')从本地缓存中同步获取指定 key 对应token的内容

然后添加请求头,将token塞进去

对于请求头🌤进行判断,然后处理resove或者抛出异常reject

js
// request.js
export default function (options) {
    return new Promise((resolve, reject) => {
        // 获取存储在本地的token
        const token = uni.getStorageSync('token') || '';
        
        // 添加请求头
        options.header = {
            ...options.header,
            'Authorization': `Bearer ${token}`,
        };

        // 发起请求
        uni.request({
            ...options,
            success: (response) => {
                // 可以在这里添加对响应的处理
                if (response.statusCode === 200) {
                    resolve(response.data);
                } else {
                    reject(response);
                }
            },
            fail: (error) => {
                reject(error);
            }
        });
    });
}

☞ 在根目录下面 新建 => api=> common📂/login.js

这里头我们主要放置我们关于登录部分的接口

这部分主要功能

  • 引入我们的config.js文件,为接口设置公共前缀
  • 引入请求和接口,设置我们的登录请求接口
js
import baseURL from '@/utils/config.js'
import request from '@/utils/request.js'
export function login(data) {
  return request({
    url: baseURL+'/api/login',
    method: 'post',
    data
  })
}

简单部分已经完毕,到这里我们就可以直接去开始开发我们的登录和注册界面了!

4、uni.request进一步使用

(1)请求登录接口

接下来对于我们的登录按钮进行完善,这里我们已经在本地启动了一个后台登录接口,需要项目的小伙伴可以去github领取后台接口项目

先来简单看一下我们的界面

image.png

这里我们请求一下本地的登录接口,然后我们先写死然后尝试一下

javascript

uni.request({
       url: 'http://localhost:8888/api/login', // 替换为你的接口地址
       method: 'GET',
       success: (res) => {
         console.log(res.data);
         this.responseData = res.data;
       },
       fail: (err) => {
         console.error('请求失败', err);
       },
});

这里我们稍微更改一下请求方式完善一下而后请求尝试一下

javascript
uni.request({
     url: 'http://localhost:8888/api/login',
     method: 'POST',
     data: {
       username: '18735797977',
       password: '123456',
     },
     success: (res) => {
       console.log('登录成功', res.data);
       // 这里可以处理登录成功后的逻辑
     },
     fail: (err) => {
       console.error('登录失败', err);
       // 处理登录失败的情况
     },
});

点击请求一下,我们可以看到,请求已经成功了!看一下我们的返回信息

JS
▼{
  code:200,
  message:"登录成功”,
  token:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZS"
}

这里可以看到我们接口已经请求成功了,并且也拿到了token

token作用:利用token我们可以验证必须需要登录的接口

这里简单梳理一下这里的逻辑

JS
// 用户点击登录,账号密码正确,返回正确的token 

// 用户拿到token,去验证需要token信息的接口,如果接口是需要登录访问的,则头部添加token进行访问 

// 不需要token的接口,用户正常访问

(2)完善Token 信息到我们的状态库中

这里我们先来完善一下我们的登录接口

javascript
success: (res) => {
       console.log('登录!!', res.data);
          if(res.data.code==200){
               console.log('登录成功', res.data);
               userStore.login(username,res.data.token);
                // 这里可以处理登录成功后的逻辑
                uni.switchTab({
                       url:'/pages/tabBar/index/index'
                })
         }
 },

完善一下我们的store状态存储,这里多加一个token信息,方便我们之后使用

javascript
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
 state: () => ({
   username: '',
   isLoggedIn: false,
   token:'',
 }),
 actions: {
   login(username,token) {
     this.username = username;
     this.token = token;
     this.isLoggedIn = true;
     console.log('login登录',this.isLoggedIn);
     console.log('token',this.token);
   },
   logout() {
     this.username = '';
     this.token = '';
     this.isLoggedIn = false;
     onsole.log('退出登录',this.isLoggedIn);
   }
 },
 getters: {
   userStatus: (state) => {
     return state.isLoggedIn ? `Welcome, ${state.username}` : 'Please log in';
   }
 }
});

这里我们查看一下已经能看到,登录部分我们拿到了token,同时在我们的全局状态信息部分也已经拿到了token

JS
OiJIUzI1NiIsInFTc3IiwiaWFOIjoxxxx

到这里,我们登录部分的功能请求接口正常,同时,我们也拿到了token

utils文件下面新建立一个文件 request.js,对于uniapp之中所有的请求进行封装和请求。’

接下来我们利用 uni.setStorageSync 进行token的存储,然后,利用 uni.getStorageSync 在全局之中获取需要token的接口进行token的添加,不需要的进行过滤掉!

完善store部分存储的数据

javascript
login(username,token) {
     this.username = username;
     this.token = token;
     this.isLoggedIn = true;
     console.log('login登录',this.isLoggedIn);
     console.log('token',this.token);
     uni.setStorageSync('token',this.token);
     console.log(uni.setStorageSync('token'),'这是存储部分storage-token');
},

完善请求部分取出数据

javascript
export default function (options) {
   return new Promise((resolve, reject) => {
       // 获取存储在本地的token
       const token = uni.getStorageSync('token') || '';
       
       // 添加请求头
       options.header = {
           ...options.header,
           'Authorization': `Bearer ${token}`,
       };

       // 发起请求
       uni.request({
           ...options,
           success: (response) => {
               // 可以在这里添加对响应的处理
               if (response.statusCode === 200) {
                   resolve(response.data);
               } else {
                   reject(response);
               }
           },
           fail: (error) => {
               reject(error);
           }
       });
   });
}

然后我们尝试一下

image.png

可以看到我们存储和获取存储都已经成功了!

(3)全局封装请求的使用

接下来我们就使用一下这个全局封装的uni.request看是否正常

那我们就简单拿一下文章类型的接口吧 ,查询文章类型

在我们的示例页面或组件之中给导入这要请求的方法

javascript

<button @click="handleType()">
   	请求文章的类型
</button>


import request from '@/utils/request.js'; //在我们的示例页面或组件之中给导入这要请求的方法


//请求文章的类型 
const handleType=()=>{
       request({
          url: 'http://localhost:8888/api/dictData',
          method: 'GET',
          parmas:{dict_type:'nexus_articletype'},
  })
  .then((data) => {
          console.log(data,'data');
  })
  .catch((error) => {
          console.error('请求失败', error);
  });
}

这里我们简单进行一下尝试

这里我请求一下然后我们可以看到: image.png

查看一下我们的头部 ,这里还发现我们的token头部信息已经添加进去了,接口也已经请求成功了! image.png

稍微完善一下,ok,我们的全局请求封装部分已经完成了!

Released under the MIT License.