Просмотр исходного кода

♻️ refactor(api): 重构API响应处理逻辑

- 改进响应头处理方式,使用循环正确设置所有响应头
- 优化body处理逻辑,区分204 No Content响应和JSON内容
- 使用标准Response构造函数替代对象字面量实现
- 移除原有的401错误处理代码(已注释)
- 修复JSON响应序列化问题,确保与标准fetch行为一致
yourname 4 месяцев назад
Родитель
Сommit
e1c9292739
1 измененных файлов с 44 добавлено и 21 удалено
  1. 44 21
      mini/src/utils/api.ts

+ 44 - 21
mini/src/utils/api.ts

@@ -37,29 +37,52 @@ const taroFetch: typeof fetch = async (input, init) => {
   try {
     const response = await Taro.request(options)
     
-    // 处理401未授权
-    if (response.statusCode === 401) {
-      Taro.removeStorageSync('token')
-      Taro.removeStorageSync('userInfo')
-      Taro.navigateTo({ url: '/pages/login/index' })
-      throw new Error('请重新登录')
-    }
+    // // 处理401未授权
+    // if (response.statusCode === 401) {
+    //   Taro.removeStorageSync('token')
+    //   Taro.removeStorageSync('userInfo')
+    //   Taro.navigateTo({ url: '/pages/login/index' })
+    //   throw new Error('请重新登录')
+    // }
 
     // 适配fetch响应格式
-    return {
-      ok: response.statusCode >= 200 && response.statusCode < 300,
-      status: response.statusCode,
-      statusText: response.errMsg || 'OK',
-      headers: new Headers(response.header || {}),
-      url: response.data?.url || url,
-      json: async () => response.data,
-      text: async () => JSON.stringify(response.data),
-      blob: async () => new Blob([JSON.stringify(response.data)]),
-      arrayBuffer: async () => new TextEncoder().encode(JSON.stringify(response.data)),
-      clone: () => ({}) as Response,
-      body: null as any,
-      bodyUsed: true
-    } as Response
+    // return {
+    //   ok: response.statusCode >= 200 && response.statusCode < 300,
+    //   status: response.statusCode,
+    //   statusText: response.errMsg || 'OK',
+    //   headers: new Headers(response.header || {}),
+    //   url: response.data?.url || url,
+    //   json: async () => response.data,
+    //   text: async () => JSON.stringify(response.data),
+    //   blob: async () => new Blob([JSON.stringify(response.data)]),
+    //   arrayBuffer: async () => new TextEncoder().encode(JSON.stringify(response.data)),
+    //   clone: () => ({}) as Response,
+    //   body: null as any,
+    //   bodyUsed: true
+    // } as Response
+
+    const responseHeaders = new Headers();
+    if (response.header) {
+      for (const [key, value] of Object.entries(response.header)) {
+        responseHeaders.set(key, value);
+      }
+    }
+
+      // 处理204 No Content响应,不设置body
+    const body = response.statusCode === 204
+    ? null
+    : responseHeaders.get('content-type')?.includes('application/json')
+      ? JSON.stringify(response.data)
+      : response.data;
+
+    return new Response(
+      body,
+      {
+        status: response.statusCode,
+        statusText: response.errMsg || 'OK',
+        headers: responseHeaders
+      }
+    )
   } catch (error) {
     console.error('API Error:', error)
     Taro.showToast({