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

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录

    • bug背景
    • 解决思路1:
    • 解决思路2
    • 解决思路3(最终解决方案)
    • 后记

bug背景

项目中采用富文本编辑器后传参引起的bug,起因如下:
在这里插入图片描述
在这里插入图片描述
数据库中存入的数据会变成这种未经转码的URL编码

在这里插入图片描述


解决思路1:

使用JSON方式传参,但富文本编辑器不支持将内容转成JSON,会遗失标签,显然不符合把富文本文章存入数据库的需求,所以PASS


解决思路2

使用URL拼接方式传参,而缺点也是明显的,URL拼接的参数长度有限,用户就不能编写长文本了。
且用此种方法,后端接收到的数据依旧会因特殊字符而转码失败(不知道是不是框架MVC配置的拦截器逻辑有问题,遇到特殊字符后就不去处理了),用URLDecoder.decode方法手动转码又过于不优雅,也不符合高可用的理念

在这里插入图片描述


解决思路3(最终解决方案)

前端使用URLSearchParams 对象以键值对方式传参
似乎是目前比较合适的解决方法

// 创建URLSearchParams对象,将参数用append方法以键值对一个个放入
const params = new URLSearchParams();params.append('key1', 'value1');params.append('key2', 'value2');

URLSearchParams 对象参考:【JS】URLSearchParams 对象(以对象的形式上传参数到url)
需要考虑各浏览器兼容性问题和解决方案

vue3前端请求方法:

const onSubmit = async function (formEl: FormInstance | undefined) {console.log(formEl)formEl.validate(async valid => {if (valid) {try {const params = new URLSearchParams()params.append('content.content', form.contentStr)params.append('destId', form.destId.toString())params.append('title', form.title)params.append('travelTime', form.travelTime)params.append('coverUrl', form.coverUrl)params.append('isPublic', form.isPublic ? '1' : '0')params.append('person', form.person)params.append('days', form.days)params.append('avgConsume', form.avgConsume)params.append('summary', form.summary)// let params = {//   destId: form.destId,//   title: form.title,//   travelTime: form.travelTime,//   coverUrl: form.coverUrl,//   isPublic: form.isPublic ? '1' : '0',//   person: form.person,//   days: form.days,//   avgConsume: form.avgConsume,//   summary: form.summary,//   contentStr: form.contentStr// }//params['content.content'] = params.contentStrconst res = await travelsAdd(params)ElMessage.success('提交日志成功')router.push('/personal/travels')} catch (err) {console.log(err)ElMessage.error(err.msg)}} else {return false}})
}

前端控制台:
在这里插入图片描述

后端请求接收,富文本context数据正常

在这里插入图片描述
在这里插入图片描述

写入数据库正常,大功告成~!


后记

自从成为全栈后感觉思考问题和找bug的视野更广了,写代码也觉得越来越有趣,越来越顺畅。相信自己选择的路,即使它不一定对,只要努力让自己不后悔就好。学有所成,劳有所获,加油~!

http://www.lryc.cn/news/254900.html

相关文章:

  • 【扩散模型】深入理解图像的表示原理:从像素到张量
  • WPS论文写作——公式和公式序号格式化
  • ChatGPT一周年,奥特曼官宣 OpenAI 新动作!
  • JVM 运行时内存篇
  • Docker安装postgres最新版
  • 浅析计算机网络安全的的防范与措施
  • 多表操作、其他字段和字段参数、django与ajax(回顾)
  • 您知道计算机是怎么分类的嘛
  • [MTK]安卓8 ADB执行ota升级
  • python-比较Excel两列数据,并分别显示差异
  • RT-DETR手把手教程:NEU-DET钢材表面缺陷检测任务 | 不同网络位置加入EMA注意力进行魔改
  • WebGL笔记:矩阵缩放的数学原理和实现
  • 处理器中的TrustZone之安全状态
  • 开发一款短剧视频小程序软件多少钱?
  • 『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行
  • 揭秘C语言结构体:通往内存对齐的视觉之旅
  • java中可重入锁的作用是什么?
  • 适合炎热天气的最佳葡萄酒有哪些?
  • 软件工程 课后题 选择 查缺补漏
  • PyQt基础_011_对话框类控件QMessage
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队
  • [LeetCode] 12. 整数转罗马数字
  • 深入了解Java Period类,对时间段的精确控制
  • 企业软件的分类有哪些|app小程序定制开发
  • 选择更好的Notes索引附件方式
  • Vue混淆与还原
  • R语言单因素方差分析+差异显著字母法标注+逐行详细解释
  • linux 消息队列apache-activemq服务的安装
  • 前端数据加密相关问题
  • Vue3中reactive和ref对比