JavaScript fetch请求用字符串插值拼接URL时含#的参数传值为空
问题根因
这个错误和JavaScript关键字没有任何关系,是URL的固有语法规则导致的。# 在URL标准中是片段标识符的起始标记,浏览器发起HTTP请求时,会自动把#以及它之后的所有内容从请求URL中移除,不会发送给后端服务。因此你传入的testabc#到服务端时只会剩下testabc,参数不完整自然会引发路由或参数校验错误。
修复方案
不要手动拼接URL查询参数,推荐两种标准的编码处理方式:
- 方案1:使用
encodeURIComponent单独编码每个参数值
手动对每个参数值做URL编码,所有敏感特殊字符都会被转义为符合规范的格式,其中#会被转义为%23,后端收到后会自动解析回原始字符:const requestUrl = `/api/Controller/UpdatePassword?currentPassword=${encodeURIComponent(currentPassword.value)}&newPassword=${encodeURIComponent(newPassword.value)}&confirmPassword=${encodeURIComponent(confirmPassword.value)}` - 方案2:使用
URLSearchParams构造参数(更推荐,无需手动处理编码)
内置API会自动完成所有参数的编码工作,代码可读性更高,也不会出现遗漏编码的问题:const queryParams = new URLSearchParams({ currentPassword: currentPassword.value, newPassword: newPassword.value, confirmPassword: confirmPassword.value }) const requestUrl = `/api/Controller/UpdatePassword?${queryParams.toString()}`
常见性说明
这是前端开发中非常普遍的问题,几乎所有初学者在手动拼接URL参数时都遇到过同类问题。除#外,&、=、+、空格、中文等字符如果不做编码直接拼接,同样可能引发参数解析异常。
内容的提问来源于stack exchange,提问作者AJ Jones
相关产品推荐
相关产品推荐

