base64 和 url base64 和 encodeURIC

2021-03-09  本文已影响0人  霡霂976447044
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, '+'))
上一篇下一篇

猜你喜欢

热点阅读