UNPKG

@realsee/five

Version:

Realsee Renderer SDK

113 lines (85 loc) • 4.28 kB
# Request Proxy (请求代理) - **Summary**: `requestProxy` 是 Five 初始化时的关键参数,用于在发起网络请求前对 URL 进行拦截和修改,常用于鉴权、资源重定向或 CDN 域名替换。 - **Schema**: `(url: string) => string | Promise<string>` - **Concepts**: 请求拦截、资源重定向、鉴权签名。 - **Configuration**: `FiveInitArgs.requestProxy`。 - **Examples**: CDN 替换、私有化部署鉴权、调试模式。 ## Schema > **Definition**: [FiveInitArgs](../../five/application/fiveInitArgs.d.ts) ```typescript interface FiveInitArgs { /** * 请求代理函数 * @description 在 Five 内部发起任何网络请求(如加载图片、模型、配置)之前调用。 * @param url - 原始请求 URL * @returns 修改后的 URL (string) 或异步返回修改后的 URL (Promise<string>) */ requestProxy?: (url: string) => string | Promise<string>; } ``` ## Concepts ### 拦截时机 Five 内部加载资源(全景图瓦片、3D 模型、纹理贴图等)时,会通过统一的 Fetcher 层发起请求。`requestProxy` 钩子函数会在每次请求发起**前**被触发。 ### 核心用途 1. **域名替换 (CDN Domain Sharding)**: 将资源请求分散到多个 CDN 域名以突破浏览器并发限制。 2. **鉴权签名 (Authentication)**: 针对私有化部署或受保护资源,在 URL 后追加鉴权 Token (如 SAS Token)。 3. **资源重定向 (Redirection)**: 在开发环境下将线上资源重定向到本地或测试环境。 4. **协议适配**: 强制将 `http` 协议升级为 `https`。 ## Configuration `requestProxy` 是 `Five` 构造函数的配置项之一。 | 参数 | 类型 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | `requestProxy` | `(url: string) => string \| Promise<string>` | `undefined` | 代理函数,返回修改后的 URL。支持同步或异步返回。 | ## Examples ### 1. 基础用法:CDN 域名替换 将图片资源请求分散到不同的 CDN 节点,加速加载。 ```typescript const five = new Five({ requestProxy: (url) => { // 简单的字符串替换示例 return url.replace('//vrlab-public.ljcdn.com/', '//vr-public.realsee-cdn.cn/'); } }); ``` ### 2. 进阶用法:异步鉴权 (Async Auth) 对于需要动态获取 Token 的场景,可以使用 `Promise` 异步返回 URL。 ```typescript const five = new Five({ requestProxy: async (url) => { // 仅对私有桶资源进行签名 if (url.includes('private-bucket')) { const token = await fetchToken(); // 假设 fetchToken 是一个获取鉴权的异步函数 const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}token=${token}`; } return url; } }); ``` ### 3. 开发调试:本地资源代理 在开发阶段,将特定资源重定向到本地文件。 ```typescript const proxyMap: Record<string, string> = {}; const five = new Five({ requestProxy: (url) => { // 如果该 URL 在映射表中存在(例如通过 <input type="file"> 加载的本地 Blob URL),则使用映射值 if (proxyMap[url]) { console.log(`[Proxy] Redirecting ${url} -> ${proxyMap[url]}`); return proxyMap[url]; } return url; } }); ``` ## Common Pitfalls 1. **死循环风险**: 不要在 `requestProxy` 内部再次发起会导致 `requestProxy` 触发的 Five 资源请求,否则可能导致递归调用。 2. **性能损耗**: `requestProxy` 会在**所有**资源请求前触发(包括成百上千个瓦片请求)。请确保该函数执行效率极高,避免进行耗时的同步操作。如果是异步操作,应做好缓存。 3. **URL 格式**: 确保返回的 URL 格式正确。如果原 URL 包含 Query 参数,拼接 Token 时要注意判断是使用 `?` 还是 `&`。 4. **缓存一致性**: 如果修改了 URL(例如加了 Token),可能会影响浏览器的缓存命中策略。 ## Related * [Parameter](./parameter.md): Five 初始化参数总览。 * [Load External Model](./load-external-model.md): 加载外部模型时也会触发 requestProxy。 --- ```yaml tags: [请求代理, 鉴权, 域名替换, 私有化, 请求拦截, configuration, network, proxy, authentication, CDN, token, url-rewrite, cors] ```