From edff91efb493383368f6eb164166e86a82673e8c Mon Sep 17 00:00:00 2001 From: lyf <2514544224@qq.com> Date: Fri, 26 Jun 2026 11:46:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20SGS=20=E5=AF=BC=E8=A7=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9C=AC=E5=9C=B0=E5=8A=A0=E8=BD=BD=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 H5 本地联调补充 SGS API、SDK 和模型资源代理,避免 /app-api 与 /minio 请求回落到前端 HTML。 增强 SGS API 响应解析诊断,遇到非 JSON 或 HTML 响应时输出请求地址、content-type 和响应片段。 --- src/data/providers/sgsSdkApiProvider.ts | 38 +++++++++++++++++++++---- vite.config.ts | 27 +++++++++++++++++- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/data/providers/sgsSdkApiProvider.ts b/src/data/providers/sgsSdkApiProvider.ts index f9d9584..b32cd10 100644 --- a/src/data/providers/sgsSdkApiProvider.ts +++ b/src/data/providers/sgsSdkApiProvider.ts @@ -209,9 +209,33 @@ const resolveAppApiBaseUrl = () => { return baseUrl.endsWith('/app-api') ? baseUrl : `${baseUrl}/app-api` } -const parseJsonPayload = (payload: unknown): T => { +const getHeaderValue = ( + header: Record | undefined, + key: string +) => { + if (!header) return '' + const matchedKey = Object.keys(header).find((item) => item.toLowerCase() === key.toLowerCase()) + return matchedKey ? String(header[matchedKey] || '') : '' +} + +const previewPayload = (payload: unknown) => { + const text = typeof payload === 'string' ? payload : JSON.stringify(payload) || '' + return text.replace(/\s+/g, ' ').trim().slice(0, 120) +} + +const parseJsonPayload = (payload: unknown, requestUrl: string, contentType: string): T => { if (typeof payload === 'string') { - return JSON.parse(payload) as T + const trimmedPayload = payload.trim() + const looksLikeHtml = /^]/i.test(trimmedPayload) + if (looksLikeHtml || contentType.toLowerCase().includes('text/html')) { + throw new Error(`SGS 数据接口返回非 JSON: ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(payload)}"`) + } + + try { + return JSON.parse(trimmedPayload) as T + } catch { + throw new Error(`SGS 数据接口 JSON 解析失败: ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(payload)}"`) + } } return payload as T @@ -222,9 +246,10 @@ const requestJson = ( options: { method?: 'GET' | 'POST'; data?: unknown } = {} ): Promise => new Promise((resolve, reject) => { const baseUrl = resolveAppApiBaseUrl() + const requestUrl = `${baseUrl}${path}` uni.request({ - url: `${baseUrl}${path}`, + url: requestUrl, method: options.method || 'GET', data: options.method === 'POST' ? JSON.stringify(options.data || {}) : undefined, header: options.method === 'POST' @@ -235,15 +260,16 @@ const requestJson = ( timeout: dataSourceConfig.sgsSdkTimeoutMs, success: (response) => { const statusCode = Number(response.statusCode || 0) + const contentType = getHeaderValue(response.header as Record | undefined, 'content-type') if (statusCode < 200 || statusCode >= 300) { - reject(new Error(`SGS 数据接口请求失败: ${statusCode} ${path}`)) + reject(new Error(`SGS 数据接口请求失败: ${statusCode} ${requestUrl} content-type=${contentType || 'unknown'} body="${previewPayload(response.data)}"`)) return } try { - const body = parseJsonPayload>(response.data) + const body = parseJsonPayload>(response.data, requestUrl, contentType) if (!body || body.code !== 0) { - reject(new Error(`SGS 数据接口业务失败: ${path} code=${body?.code} msg=${body?.msg || ''}`)) + reject(new Error(`SGS 数据接口业务失败: ${requestUrl} code=${body?.code} msg=${body?.msg || ''}`)) return } diff --git a/vite.config.ts b/vite.config.ts index 3deedf1..0680837 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,35 @@ import { defineConfig } from 'vite' import uni from '@dcloudio/vite-plugin-uni' +const sgsDevServer = 'http://1.92.206.90:3001' +const sgsAssetServer = 'http://1.92.206.90:9000' + export default defineConfig({ plugins: [uni()], server: { - host: '0.0.0.0' + host: '0.0.0.0', + proxy: { + '/app-api': { + target: sgsDevServer, + changeOrigin: true + }, + '/h5-sdk': { + target: sgsDevServer, + changeOrigin: true + }, + '/sdk': { + target: sgsDevServer, + changeOrigin: true + }, + '/museum-assets': { + target: sgsAssetServer, + changeOrigin: true + }, + '/minio': { + target: sgsDevServer, + changeOrigin: true + } + } }, resolve: { alias: {