http 请求参数+号变成空格问题
最近遇到protobuffer数据转换的Base64字符串在发到后端出现异常的问题,调查了一下发现base64里的+号发过去变成了空格,进一步查找发现是由于我们的数据是附在url,实际上是url转换造成的,其实我们应该对parameter做转码处理,再通过url发送才不会出现这样的问题。
1.问题原因:
例如下面的字符串:
ABCDEFGabcdefg+=
在浏览器中:
查看原来view source
浏览器转换后 view parsed
view encoded
view decoded
可以看到经过encoded decoded后+号就变成空格了。
2 解决方法:
查找了一些解决方法,前端可以通过对url进行编码解决,具体可以通过直接正则匹配+号等替换成%2B,也可以调用encodeURIComponent这个函数。
encodeURIComponent
返回值
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
其他字符(比如 :;/? : @&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
ABCDEFGabcdefg%2B%3D
另一个encodeURI其实不会处理+:
encodeURI
返回值
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/? : @ &=+$,#
ABCDEFGabcdefg+=
转换后+变成%2B, =变成%3D。
在浏览器中传输结果如下,可以看到最终解码得到正确的字符串:
view source
view parsed
view URL encoded
view decoded