From e0b5504539254a8b5cd886fc697b3e9b41e0b8ef Mon Sep 17 00:00:00 2001 From: Zhao Jianing <18910855655@163.com> Date: Thu, 22 Oct 2026 16:25:43 +0800 Subject: [PATCH] fix: API test console sends requests to the selected data source, not the page origin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EndpointTab 的 DataSourceSelector 选中的 origin 只用于展示代码块, ParamsTableWithForm 从未收到它——测试请求用相对路径构造,axios 解析到页面 origin(window.location.origin)而非选中的数据源。 默认状态下 UI 显示 https://oss-compass.isrc.ac.cn/api/v2/... 而 请求实际打到当前站点后端。 同时移除 ParamsTableWithForm 的三处 debug console.log——其中 console.log(values) 在每次"发送请求"时将用户的 access_token (API 密钥)完整输出到浏览器控制台。 baseUrl 从 EndpointTab 传入并用于 constructUrl。 --- .../APIDocumentation/EndpointTab.test.tsx | 50 +++++++++++++++++++ .../DataView/APIDocumentation/EndpointTab.tsx | 1 + .../APIDocumentation/ParamsTableWithForm.tsx | 15 ++---- 3 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.test.tsx diff --git a/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.test.tsx b/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.test.tsx new file mode 100644 index 0000000000..65b28e06fc --- /dev/null +++ b/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.test.tsx @@ -0,0 +1,50 @@ +jest.mock('next-i18next', () => ({ + useTranslation: () => ({ t: (key: string) => key, i18n: { language: 'zh' } }), +})); +jest.mock('axios', () => ({ + __esModule: true, + default: jest.fn(), +})); +jest.mock('./DescriptionContent', () => ({ + __esModule: true, + default: () => null, +})); +jest.mock('./ResponsesViewer', () => ({ + __esModule: true, + default: () => null, +})); +jest.mock('./ParamsTableWithForm', () => ({ + __esModule: true, + default: jest.fn(() => null), +})); + +import { render } from '@testing-library/react'; +import axios from 'axios'; +import EndpointTab from './EndpointTab'; +import ParamsTableWithForm from './ParamsTableWithForm'; + +const endpoint = { + id: 'ep-1', + method: 'GET', + path: '/api/v2/metrics/community', + summary: 'Community metrics', + description: '', + parameters: [], + responses: {}, +}; + +describe('EndpointTab', () => { + it('passes the selected data source origin to the test form', () => { + // 数据源选择器选中的 origin 是测试请求的目标——此前 ParamsTableWithForm + // 只收到相对路径,axios 解析到页面 origin 而非选中的数据源。 + render(); + expect(ParamsTableWithForm).toHaveBeenCalledWith( + expect.objectContaining({ + baseUrl: 'https://oss-compass.isrc.ac.cn', + path: '/api/v2/metrics/community', + method: 'GET', + }), + expect.anything() + ); + }); +}); diff --git a/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.tsx b/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.tsx index e6cea2195a..00c01b31d1 100644 --- a/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.tsx +++ b/apps/web/src/modules/dataHub/DataView/APIDocumentation/EndpointTab.tsx @@ -36,6 +36,7 @@ const EndpointTab = ({ endpoint }) => { key={endpoint?.id} method={endpoint.method} path={endpoint.path} + baseUrl={baseUrl} params={endpoint.parameters.map((p) => ({ ...p, key: p.name, diff --git a/apps/web/src/modules/dataHub/DataView/APIDocumentation/ParamsTableWithForm.tsx b/apps/web/src/modules/dataHub/DataView/APIDocumentation/ParamsTableWithForm.tsx index 0b65f6bc65..e96c3f5a6b 100644 --- a/apps/web/src/modules/dataHub/DataView/APIDocumentation/ParamsTableWithForm.tsx +++ b/apps/web/src/modules/dataHub/DataView/APIDocumentation/ParamsTableWithForm.tsx @@ -20,10 +20,12 @@ const constructUrl = (path: string, values: any) => { const ParamsTableWithForm = ({ method, path, + baseUrl, params, }: { method: string; path: string; + baseUrl?: string; params: ApiParameter[]; }) => { const { t, i18n } = useTranslation(); @@ -134,7 +136,6 @@ const ParamsTableWithForm = ({ }; const handleTest = async (values: any) => { - console.log(values); setLoading(true); setTestResult(null); @@ -153,21 +154,15 @@ const ParamsTableWithForm = ({ param.type ); - // 添加调试日志,显示参数处理前后的变化 - if (originalValue !== processedValues[param.name]) { - console.log(`参数 ${param.name} (${param.type}) 处理: `, { - 原始值: originalValue, - 处理后: processedValues[param.name], - 类型: typeof processedValues[param.name], - }); - } } }); try { + // 数据源选择器选中的 origin 才是测试请求的目标——此前用的是相对路径, + // axios 解析到页面 origin 而非选中的数据源。 const config = { method: method.toLowerCase(), - url: constructUrl(path, processedValues), // 使用处理过的 processedValues + url: constructUrl((baseUrl || '') + path, processedValues), data: method === 'POST' ? processedValues : null, // 使用处理过的 processedValues params: method === 'GET' ? processedValues : null, // 使用处理过的 processedValues };