uni.request二次封装

发布时间 2023-12-03 11:04:56作者: jialiangzai
点击查看代码
const baseUrl = 'https://your-api-base-url.com';

function getAuthToken() {
  // 获取token的逻辑,可能会从全局状态、本地存储等地方获取
  // 返回token字符串或null
}

function updateAuthToken(token) {
  // 更新token的逻辑
}

function getUserInfoWithNewToken() {
  // 使用新的token获取用户信息的逻辑
  // 可能涉及到发送另一个请求
}

function requestWithRetry(options) {
  const token = getAuthToken();
  const headers = {
    ...options.headers,
    Authorization: `Bearer ${token}`,
  };

  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      header: headers,
      success: (response) => {
        if (response.statusCode === 200) {
          // 假设服务器返回的数据结构是 { code: 200, data: { ... } }
          resolve(response.data.data); // 简化data一层
        } else if (response.statusCode === 401) {
          // token无效或已过期,尝试刷新token
          refreshAuthToken().then(newToken => {
            // 更新token
            updateAuthToken(newToken);
            // 使用新token重新发送请求
            requestWithRetry({
              ...options,
              headers: {
                ...options.headers,
                Authorization: `Bearer ${newToken}`,
              },
            }).then(resolve).catch(reject);
          }).catch(() => {
            reject(new Error('Unauthorized'));
          });
        } else {
          reject(new Error('Error in response'));
        }
      },
      fail: (error) => {
        reject(error);
      },
    });
  });
}

function refreshAuthToken() {
  return new Promise((resolve, reject) => {
    // 发送请求获取新的token
    // 假设这里发送了一个请求并获取到了新的token
    const newToken = 'your-new-token';
    resolve(newToken);
  });
}

// 使用封装的请求函数
requestWithRetry({
  url: `${baseUrl}/your-endpoint`,
  method: 'GET',
  headers: { /* your additional headers */ },
}).then(data => {
  console.log('Request successful with data:', data);
}).catch(error => {
  console.error('Request failed:', error);
});