diff --git a/WebContent/js/djb/apispec/app.js b/WebContent/js/djb/apispec/app.js index 5789493..4d2ba55 100644 --- a/WebContent/js/djb/apispec/app.js +++ b/WebContent/js/djb/apispec/app.js @@ -189,15 +189,23 @@ // 경로(op.path.value)에는 어댑터경로가 이미 baking 됨(백엔드 applyAutoRules). 서버에는 응답유형별 호스트만 붙인다. // - gw : djb.gateway.base-url (PortalProperty) → [gw호스트 + 어댑터경로 + 경로] - // - mock : Mock Server URL → [mock호스트 + 어댑터경로 + 경로] + // - mock : Mock Server URL(전체 URL) → [mock URL 그대로] (어댑터/오퍼레이션 경로 미부착) // - 그 외 : 호스트 없음 → [어댑터경로 + 경로] var _rt = (d.portal && d.portal.responseType) || 'sample'; var _host; - if (_rt === 'gw') _host = (window.DJB_CTX && window.DJB_CTX.gwAddress) || 'http://127.0.0.1:39310'; - else if (_rt === 'mock') _host = (d.portal && d.portal.mockUrl) || ''; - else _host = ''; + var _pathKey = op.path.value; + if (_rt === 'gw') { + _host = (window.DJB_CTX && window.DJB_CTX.gwAddress) || 'http://127.0.0.1:39310'; + } else if (_rt === 'mock') { + // Mock 은 전체 호출 URL. origin=서버, pathname(+query)=경로로 분해해 경로가 뒤에 덧붙지 않도록 한다. + var _mk = splitFullUrl((d.portal && d.portal.mockUrl) || ''); + _host = _mk.origin; + _pathKey = _mk.path; + } else { + _host = ''; + } if (_host) spec.servers = [{ url: _host }]; - spec.paths[op.path.value] = { [op.method.value.toLowerCase()]: operation }; + spec.paths[_pathKey] = { [op.method.value.toLowerCase()]: operation }; // 보안 스킴 d.securitySchemes.forEach(s => { @@ -946,14 +954,27 @@ } } - // 응답유형별 실제 호출 주소. 경로(op.path.value)에 어댑터경로가 이미 포함, 호스트만 응답유형별로 앞에 붙임. + // 전체 URL → { origin, path }. Mock Server URL 을 서버+경로로 분해(경로를 별도로 덧붙이지 않기 위함). + function splitFullUrl(u) { + u = (u || '').trim(); + if (!u) return { origin: '', path: '/' }; + try { + var parsed = new URL(u); + var path = (parsed.pathname || '/') + (parsed.search || ''); + if (!path || path.charAt(0) !== '/') path = '/' + path; + return { origin: parsed.origin, path: path }; + } catch (e) { + // 스킴 누락/파싱 실패 → 통째 origin 취급, path 는 '/' + return { origin: u.replace(/\/+$/, ''), path: '/' }; + } + } + + // 응답유형별 실제 호출 주소. gw 는 [호스트 + 경로], mock 은 입력한 전체 URL 그대로(경로 미부착). function resolvedCallUrl() { var d = state.data; var rt = (d.portal && d.portal.responseType) || 'sample'; - var host; - if (rt === 'gw') host = (window.DJB_CTX && window.DJB_CTX.gwAddress) || 'http://127.0.0.1:39310'; - else if (rt === 'mock') host = (d.portal && d.portal.mockUrl) || ''; - else host = ''; + if (rt === 'mock') return (((d.portal && d.portal.mockUrl) || '').trim()) || '(주소 없음)'; + var host = (rt === 'gw') ? ((window.DJB_CTX && window.DJB_CTX.gwAddress) || 'http://127.0.0.1:39310') : ''; var path = (d.operation && d.operation.path && d.operation.path.value) || ''; if (!host) return path || '(주소 없음)'; return host.replace(/\/+$/, '') + (path.charAt(0) === '/' ? path : '/' + path); @@ -1012,7 +1033,7 @@ : `
${escapeHtml(resolvedCallUrl())}djb.gateway.base-url 값을 사용합니다.