Files
bodyWeight/miniprogram/utils/request/index.ts
T

89 lines
2.7 KiB
TypeScript

import type { ApiResponse, HttpMethod, RequestOptions } from './types'
export type { ApiResponse, RequestOptions }
const BASE_URL = 'http://192.168.1.31:8889/' // 测试环境
// const BASE_URL = 'https://device.shuziweidao.com/gateway/' // 正式环境
let _loadingCount = 0
const _showLoading = (title: string): void => {
if (_loadingCount === 0) wx.showLoading({ title, mask: true })
_loadingCount++
}
const _hideLoading = (): void => {
if (_loadingCount > 0) _loadingCount--
if (_loadingCount === 0) wx.hideLoading()
}
const request = <T = any>(
url: string,
data?: Record<string, any>,
method: HttpMethod = 'GET',
options: RequestOptions = {},
): Promise<ApiResponse<T>> => {
const { loading = true, loadingTitle = '加载中...', contentType = 'application/json' } = options
if (loading) _showLoading(loadingTitle)
const header: Record<string, string> = { 'content-type': contentType }
const token = wx.getStorageSync('token') as string
if (token) header['X-Access-Token'] = token
return new Promise((resolve, reject) => {
wx.request({
url: BASE_URL + url,
data,
method,
header,
success: (res) => {
if (loading) _hideLoading()
const body = res.data as ApiResponse<T>
if (body.code === 200) {
resolve(body)
} else if (body.code === 401) {
wx.clearStorageSync()
wx.reLaunch({ url: '/pages/login/login' })
reject(body)
} else {
wx.showToast({ title: body.message || '请求失败', icon: 'none' })
reject(body)
}
},
fail: (err) => {
if (loading) _hideLoading()
wx.showToast({ title: '网络异常,请重试', icon: 'none' })
reject(err)
},
})
})
}
export const get = <T = any>(
url: string,
data?: Record<string, any>,
options?: RequestOptions,
): Promise<ApiResponse<T>> => request<T>(url, data, 'GET', options)
export const post = <T = any>(
url: string,
data?: Record<string, any>,
options?: RequestOptions,
): Promise<ApiResponse<T>> => request<T>(url, data, 'POST', options)
export const put = <T = any>(
url: string,
data?: Record<string, any>,
options?: RequestOptions,
): Promise<ApiResponse<T>> => request<T>(url, data, 'PUT', options)
export const del = <T = any>(
url: string,
data?: Record<string, any>,
options?: RequestOptions,
): Promise<ApiResponse<T>> => request<T>(url, data, 'DELETE', {
contentType: 'application/x-www-form-urlencoded',
...options,
})