1 先来看base64编码
In [15]: base64.b64encode(b"http://a.com/c?a=3&c=34")
Out[15]: b'aHR0cDovL2EuY29tL2M/YT0zJmM9MzQ='
2 再看url base64编码
In [18]: base64.urlsafe_b64encode(b"http://a.com/c?a=3&c=34")
Out[18]: b'aHR0cDovL2EuY29tL2M_YT0zJmM9MzQ='
可以看出,非url base64不会对斜杠进行编码。
准确的说:url base64 会将 +和/分别替换为- _两个字符
假设是路径参数:http://a.com/aHR0cDovL2EuY29tL2M/YT0zJmM9MzQ=
这样传输肯定是后端解析不到完整的路径参数,所以要使用urlsafe_b64encode。
假设是url查询参数, http://a.com?c=aHR0cDovL2EuY29tL2M/YT0zJmM9MzQ=
和http://a.com?c=aHR0cDovL2EuY29tL2M_YT0zJmM9MzQ
后端也肯定是可以正常解析的
3 encodeURIComponent
encodeURIComponent("http://a.com/c?a=3&c=34")
"http%3A%2F%2Fa.com%2Fc%3Fa%3D3%26c%3D34"
当前端需要传递一个查询参数带有特殊字符的时候,可以使用encodeURIComponent,后端Flask能够正常解析出,明文传输会导致解析出来参数不完整
此处如果不使用encodeURIComponent编码会导致 callback_url=http://a.com/c?a=3&c=34 后端解析到参数是callback_url: http://a.com/c?a=3
@bp.route('/test/c')
def c():
"""
http ':9006/api/v1/test/c?callback_url=http://a.com/c?a=3&c=34'
http ':9006/api/v1/test/c?callback_url=http%3A%2F%2Fa.com%2Fc%3Fa%3D3%26c%3D34'
"""
res = request.args.get('callback_url', '')
return success_json({
'ccc': 'ccc',
'res': res
})
other
py 解析encodeURIComponent
from urllib import parse
parse.unquote(xxx)
js urlsafe_b64encode
atob(data.replace(/_/g, '/').replace(/-/g, '+'))
网友评论