JhHardwareWRS/utils/request.js
2026-07-10 10:12:03 +08:00

161 lines
4.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const config = require('./config')
const AUTH_KEY = 'jh_wrs_auth'
const getAuth = () => wx.getStorageSync(AUTH_KEY) || null
const setAuth = auth => {
wx.setStorageSync(AUTH_KEY, auth)
return auth
}
const clearAuth = () => {
wx.removeStorageSync(AUTH_KEY)
}
const buildQuery = params => Object.keys(params || {})
.filter(key => params[key] !== undefined && params[key] !== null && params[key] !== '')
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&')
const formatErrorDetail = detail => {
if (Array.isArray(detail)) {
return detail.map(item => item.msg || item.message || JSON.stringify(item)).join('')
}
if (detail && typeof detail === 'object') {
return detail.msg || detail.message || JSON.stringify(detail)
}
return detail
}
const request = options => new Promise((resolve, reject) => {
const auth = getAuth()
const query = buildQuery(options.params)
const url = `${config.apiBaseUrl}${options.url}${query ? `?${query}` : ''}`
wx.request({
url,
method: options.method || 'GET',
data: options.data || undefined,
timeout: options.timeout || 15000,
header: {
'content-type': 'application/json',
...(auth && auth.accessToken ? { Authorization: `Bearer ${auth.accessToken}` } : {}),
...(options.header || {}),
},
success: res => {
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.data)
return
}
if (res.statusCode === 401) {
clearAuth()
}
const detail = res.data && (res.data.detail || res.data.message)
const message = formatErrorDetail(detail) || `接口请求失败:${res.statusCode}`
const error = new Error(message)
error.statusCode = res.statusCode
error.detail = detail
reject(error)
},
fail: err => {
reject(new Error(err.errMsg || '网络请求失败'))
},
})
})
const upload = options => new Promise((resolve, reject) => {
const auth = getAuth()
wx.uploadFile({
url: `${config.apiBaseUrl}${options.url}`,
filePath: options.filePath,
name: options.name || 'file',
timeout: options.timeout || 30000,
header: {
...(auth && auth.accessToken ? { Authorization: `Bearer ${auth.accessToken}` } : {}),
...(options.header || {}),
},
success: res => {
let data = res.data
try {
data = data ? JSON.parse(data) : {}
} catch (error) {
data = { raw: res.data }
}
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(data)
return
}
reject(new Error(formatErrorDetail(data && (data.detail || data.message)) || `上传失败:${res.statusCode}`))
},
fail: err => {
reject(new Error(err.errMsg || '上传失败'))
},
})
})
const download = options => new Promise((resolve, reject) => {
const auth = getAuth()
const query = buildQuery(options.params)
wx.downloadFile({
url: `${config.apiBaseUrl}${options.url}${query ? `?${query}` : ''}`,
header: {
...(auth && auth.accessToken ? { Authorization: `Bearer ${auth.accessToken}` } : {}),
...(options.header || {}),
},
timeout: options.timeout || 30000,
success: res => {
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.tempFilePath)
return
}
if (res.statusCode === 401) {
clearAuth()
}
const error = new Error(`下载失败:${res.statusCode}`)
error.statusCode = res.statusCode
reject(error)
},
fail: err => {
reject(new Error(err.errMsg || '下载失败'))
},
})
})
const downloadUrl = options => new Promise((resolve, reject) => {
const auth = getAuth()
wx.downloadFile({
url: options.url,
filePath: options.filePath,
header: {
...(auth && auth.accessToken ? { Authorization: `Bearer ${auth.accessToken}` } : {}),
...(options.header || {}),
},
timeout: options.timeout || 30000,
success: res => {
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.filePath || res.tempFilePath || options.filePath)
return
}
if (res.statusCode === 401) {
clearAuth()
}
const error = new Error(`下载失败:${res.statusCode}`)
error.statusCode = res.statusCode
reject(error)
},
fail: err => {
reject(new Error(err.errMsg || '下载失败'))
},
})
})
module.exports = {
clearAuth,
download,
downloadUrl,
getAuth,
request,
setAuth,
upload,
}