当前位置: 首页 > news >正文

Vue3中API设计与编码兼容性分析

代码:

/** * 下载质量体系文件,实现 SQL Server image 类型文件下载,使用 get 请求 * @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、非ASCII字符​​(如中文、日文等),这些字符为非安全字符,在URL中都会被编码传输) * @returns 文件流 {@link Blob} */ export const qualityFileDownloadFileService = (fileNo: string) => { // 1、预先不处理 fileNo // 2、发送请求时,将 4.2 人员∕/vVv+DW=dw 编码为 4.2+2%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw,其中空格编码为+ // 3、最终发送请求Request URL为:http://localhost:5173/api/resources/qualityFile/downloadFile?fileNo=4.2+2%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw // 4、后端通过@RequestParam接收数据时会自动将URL中的 4.2+2%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw 解码为 4.2 2人员v∕V/v+DW=dw // 5、后端不需要再额外处理 return request.get("/resources/qualityFile/downloadFile", { params: { fileNo: fileNo }, // 响应类型为 blob,用于接收二进制数据流 responseType: "blob" }); }; /** * 下载质量体系文件,实现 SQL Server image 类型文件下载,使用 get 请求,并且使用 encodeURIComponent 对文件编号进行编码处理 * @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、非ASCII字符​​(如中文、日文等),这些字符为非安全字符,在URL中都会被编码传输) * @returns 文件流 {@link Blob} */ export const qualityFileDownloadFileWithGetByEncodeService = (fileNo: string) => { // 1、预先处理 fileNo,使用 encodeURIComponent 将 4.2 2人员v∕V/v+DW=dw,编码为 4.2%202%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw,其中空格编码为%20 // 2、发送请求时,将 4.2%202%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw 编码为 4.2%25202%25E4%25BA%25BA%25E5%2591%2598v%25E2%2588%2595V%252Fv%252BDW%253Ddw,主要是将%编码为%25 // 3、最终发送请求Request URL为:http://localhost:5173/api/resources/qualityFile/downloadFileWithGetByEncode?fileNo=4.2%25202%25E4%25BA%25BA%25E5%2591%2598v%25E2%2588%2595V%252Fv%252BDW%253Ddw // 4、后端先通过@RequestParam接收数据时会自动将URL中的 4.2%25202%25E4%25BA%25BA%25E5%2591%2598v%25E2%2588%2595V%252Fv%252BDW%253Ddw 解码为 4.2%202%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw // 5、后端再通过 UriUtils 进行解码处理,将 4.2%202%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw 解码为 4.2 2人员v∕V/v+DW=dw const encodedFileNo = encodeURIComponent(fileNo); return request.get("/resources/qualityFile/downloadFileWithGetByEncode", { params: { fileNo: encodedFileNo }, // 响应类型为 blob,用于接收二进制数据流 responseType: "blob" }); };

这两种API的设计是为了解决不同场景下的URL编码问题,特别是在处理特殊字符时的兼容性需求。以下是主要原因:

1.编码处理方式不同

第一种API (qualityFileDownloadFileService)

  • 不进行预编码:依赖axios/请求库的自动编码

  • 空格处理:自动编码为+

  • 后端处理:Spring Boot会自动解码,无需额外处理

第二种API (qualityFileDownloadFileWithGetByEncodeService)

  • 主动编码:使用encodeURIComponent()预编码

  • 空格处理:编码为%20

  • 后端处理:需要手动二次解码

2.兼容性考虑

场景1:标准REST API(第一种)

javascript

// 适用场景:现代框架、Spring Boot标准配置 // 优点:简洁,符合REST规范 // 缺点:某些旧系统可能无法正确处理+号

场景2:旧系统或特殊编码需求(第二种)

javascript

// 适用场景: // 1. 旧版后端系统 // 2. 需要与前端JavaScript标准编码保持一致 // 3. 与其他系统(非Java)集成时

3.特殊字符处理差异

示例:4.2 2人员v∕V/v+DW=dw

第一种API的编码结果:

  • 空格 →+

  • /%2F

  • 中文 →%E4%BA%BA%E5%91%98

  • 发送:4.2+2%E4%BA%BA%E5%91%98v%E2%88%95V%2Fv%2BDW%3Ddw

第二种API的编码结果:

  • 空格 →%20

  • /%2F

  • 双重编码:%%25

  • 发送:4.2%25202%25E4%25BA%25BA%25E5%2591%2598v%25E2%2588%2595V%252Fv%252BDW%253Ddw

4.实际应用建议

推荐使用第一种API

javascript

// 理由: // 1. 更简洁,无需手动编码 // 2. 符合大多数现代框架的约定 // 3. Spring Boot能正确处理自动解码 // 4. 减少编码错误可能性 // 使用示例 const downloadFile = async (fileNo: string) => { try { const response = await qualityFileDownloadFileService(fileNo); // 处理blob响应 } catch (error) { console.error('下载失败', error); } };

第二种API的适用场景

javascript

// 仅在以下情况使用: // 1. 后端明确要求手动编码 // 2. 与其他系统集成时编码规则不一致 // 3. 处理特定字符集问题 // 示例:需要与Node.js或其他后端系统保持编码一致时 const downloadWithEncode = async (fileNo: string) => { // 确保编码方式与其他系统匹配 return qualityFileDownloadFileWithGetByEncodeService(fileNo); };

5.最佳实践总结

typescript

// 统一建议: // 1. 新项目使用第一种API // 2. 保持前后端编码规则一致 // 3. 在API文档中明确说明编码要求 // 4. 考虑使用POST方式传输复杂参数 // 如果遇到编码问题,可以考虑: export const qualityFileDownloadFileService = (fileNo: string) => { // 统一使用URLSearchParams处理特殊字符 const params = new URLSearchParams(); params.append('fileNo', fileNo); return request.get("/resources/qualityFile/downloadFile", { params, responseType: "blob" }); };

结论:第一种API是推荐的标准做法,第二种API主要用于特定兼容性场景。在设计API时,应该优先考虑标准的、简化的工作流程,减少不必要的编码解码环节。

http://www.cnnetsun.cn/news/12396.html

相关文章:

  • 阿里Qwen3-VL-8B-Thinking-FP8:80亿参数开启多模态AI普惠时代
  • Wan2.2-T2V-A14B在连锁门店促销视频批量定制中的应用
  • matRad开源放射治疗系统:从零开始的完整使用指南 [特殊字符]
  • Balena Etcher镜像烧录工具终极完整手册
  • 3步掌握JSON差异对比:从配置混乱到数据清晰的蜕变之路
  • Mermaid.js流程图布局优化:从Dagre到ELK的实践指南
  • 2025大模型安全新标杆:Qwen3-4B-SafeRL如何解决“防护与实用“两难
  • Wan2.2-T2V-A14B模型训练数据揭秘:高质量视频生成的关键
  • MIFARE Classic Tool终极指南:2025年如何快速掌握NFC标签操作?
  • Wan2.2-T2V-A14B模型在糖尿病管理教育视频中的生活化呈现
  • Markn轻量级Markdown查看器:提升文档阅读体验的终极指南
  • 大数据精准获客开启数据驱动的获客新篇章
  • ReplayBook终极指南:英雄联盟回放管理与数据分析完整教程
  • Wan2.2-T2V-A14B能否生成带有品牌专属开场动画的标准化输出?
  • Office文档自动化进阶指南:精通Open XML SDK实战技巧
  • 终极Bootstrap后台模板:5分钟搭建专业管理系统
  • 无需“考官“的AI推理革命:RLPR-Qwen2.5-7B-Base如何突破验证器依赖瓶颈
  • Wan2.2-T2V-A14B模型在金融产品说明视频生成中的合规审查
  • 从零开始:5分钟掌握Android设备自动化神器adbutils
  • NVIDIA ChronoEdit-14B发布:让AI图像编辑具备物理常识的革命突破
  • Win11Debloat终极指南:简单三步告别Windows系统臃肿
  • Wan2.2-T2V-A14B模型在图书馆数字资源导览中的应用探索
  • 10分钟掌握AMD Ryzen处理器深度调试:SMUDebugTool完全指南
  • 深度解析城通网盘直连技术:高效下载的终极方案
  • Venera漫画阅读器:从零开始的终极配置手册
  • 第11.4节 混合储能系统能量管理
  • 实时视频生成革命:LightX2V开源技术栈如何重塑创作生态
  • 【微实验】直方图均衡化:让光影重获新生的魔法,在明暗之间编织细节的诗篇
  • 明日方舟自动化新纪元:MAA如何用智能算法重构游戏体验
  • Wan2.2-T2V-A14B模型能否生成带倒计时功能的活动预告?