request.uts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // request.uts - 无警告 最终版
  2. export class RequestOptions {
  3. url : string = ''
  4. method : string = 'GET'
  5. params : UTSJSONObject | null = null
  6. data : UTSJSONObject | null = null
  7. showLoading : boolean = true
  8. loadingMsg : string = '加载中'
  9. showError : boolean = true
  10. }
  11. // 修复:any → any | null 声明可空,消除null判断警告
  12. function toUTSJSONObject(obj : any | null) : UTSJSONObject | null {
  13. if (obj == null) return null
  14. if (obj instanceof UTSJSONObject) return obj
  15. const result = new UTSJSONObject()
  16. const keys = UTSJSONObject.keys(obj as UTSJSONObject)
  17. for (let i = 0; i < keys.length; i++) {
  18. const key = keys[i]
  19. const val = (obj as UTSJSONObject).get(key)
  20. if (val != null) {
  21. result.set(key, val)
  22. }
  23. }
  24. return result
  25. }
  26. // Map 转 UTSJSONObject
  27. function mapToUTSJSONObject(map : Map<string, string>) : UTSJSONObject {
  28. const obj = new UTSJSONObject()
  29. map.forEach((value : string, key : string) => {
  30. obj.set(key, value)
  31. })
  32. return obj
  33. }
  34. // 修复:any → any | null
  35. function buildQueryString(params : any | null) : string {
  36. if (params == null) return ''
  37. const obj = toUTSJSONObject(params)
  38. if (obj == null) return ''
  39. const keys = UTSJSONObject.keys(obj)
  40. let query = ''
  41. for (let i = 0; i < keys.length; i++) {
  42. const key = keys[i]
  43. const val = obj.get(key)
  44. if (val != null) {
  45. if (query.length > 0) query += '&'
  46. query += key + '=' + encodeURIComponent(val.toString())
  47. }
  48. }
  49. return query
  50. }
  51. export function request(options : any | null) : Promise<any> {
  52. return new Promise<any>((resolve, reject) => {
  53. if (options == null) {
  54. reject(new Error('请求参数不能为空'))
  55. return
  56. }
  57. const opts = toUTSJSONObject(options)
  58. if (opts == null) {
  59. reject(new Error('请求参数格式错误'))
  60. return
  61. }
  62. const baseURL = '/'
  63. const url = opts.getString('url') ?? ''
  64. const method = opts.getString('method') ?? 'GET'
  65. const params = opts.get('params')
  66. const data = opts.get('data')
  67. const showLoading = opts.getBoolean('showLoading') ?? true
  68. const loadingMsg = opts.getString('loadingMsg') ?? '加载中'
  69. // 拼接基础地址 + 接口地址
  70. let finalUrl = baseURL + url.replace(/^\//, '')
  71. const upperMethod = method.toUpperCase()
  72. // GET 参数拼接
  73. if (upperMethod === 'GET' && params != null) {
  74. const query = buildQueryString(params)
  75. if (query.length > 0) finalUrl += '?' + query
  76. }
  77. const headerMap = new Map<string, string>()
  78. headerMap.set('Content-Type', 'application/json')
  79. const token = uni.getStorageSync('token') as string
  80. if (token.length > 0) headerMap.set('Authorization', 'Bearer ' + token)
  81. const tenantId = uni.getStorageSync('tenantId') as string | null
  82. headerMap.set('tenant-id', tenantId ?? 'default')
  83. headerMap.set('terminal', uni.getSystemInfoSync().platform)
  84. const header = mapToUTSJSONObject(headerMap)
  85. let requestData : string | null = null
  86. if (upperMethod !== 'GET' && data != null) {
  87. requestData = JSON.stringify(data)
  88. }
  89. if (showLoading) {
  90. uni.showLoading({ title: loadingMsg, mask: true })
  91. }
  92. uni.request({
  93. url: finalUrl,
  94. method: upperMethod,
  95. data: requestData,
  96. header: header,
  97. timeout: 15000,
  98. success: (res) => {
  99. uni.hideLoading()
  100. if (res.statusCode >= 200 && res.statusCode < 300) {
  101. resolve(res.data as any ?? {})
  102. } else {
  103. reject(new Error('请求失败:HTTP ' + res.statusCode))
  104. }
  105. },
  106. fail: (err) => {
  107. uni.hideLoading()
  108. reject(new Error('网络错误:' + err.errMsg))
  109. }
  110. })
  111. })
  112. }