API接口参数类型设计 郝伟 2021/03/02 [TOC]

1. 数据类型设计

在neo4j CQL支持以下数据类型。由于在解析时,不同的格式的组合有所区别,所以在传递时需要需要指明类型。在本设计中,类型使用缩写表示,比如 i32 表示32位整型,即 int

编号 CQL数据类型 缩写 用法
1 boolean b01 逻辑值 true/false。
2 byte i08 8位整数。
3 short i16 16位整数。
4 int i32 32位整数。
5 long i64 64位整数。
6 float f32 32位浮点数。
7 double f64 64位浮点数。
8 char c16 16位字符。
9 string c64 Base64表示的字符串。

如果写上类型则会转换为对应的数据类型,如果不写或写错,则以字符串处理。 示例 name='tom'

2. 转义

需要转义的字符包括:

\ - ? . = &

3. 字符串表示

因为URL本身就是字符串,所以当value的值也为字符串时,可能会包括非法的内容,比如/, &= 等内容。为了避免此问题,故使用Base64编码保存。

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,本设计采用一种用于URL的改进Base64编码,它在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

import base64

def b64encode(s):
    ''' 将输入常规字符串转为base64字符串 '''
    return base64.b64encode(s.encode(encoding='utf-8')).decode().replace('/', '_').replace('+', '-')

def b64decode(s):
    ''' 将输入的base64字符串转为常规字符串 '''
    return base64.b64decode(s.replace('_', '/').replace('-', '+').encode(encoding='utf-8')).decode()

# 以下是测试代码,在测试字符串中包括换行符号、等号、问号、引号、斜杠以及中英文混排等非标准内容
text = '''Line001: 我是字符串, p j g'Hello', "Are you OK",这不是中文。
Line002: url/a=?backup-2021_01_28.zip'''
encoded=b64encode(text)
decoded=b64decode(encoded)

# 打印输出
print(' 原始字符串 '.center(60, '*'))
print(text)
print(' 编码字符串 '.center(60, '*'))
print(encoded)
print(' 解码字符串 '.center(60, '*'))
print(decoded)
print('*'*65)

以下是执行结果。

************************** 原始字符串 ***************************
Line001: 我是字符串, p j g'Hello', "Are you OK",这不是中文。
Line002: url/a=?backup-2021_01_28.zip
************************** 编码字符串 ***************************
TGluZTAwMTog5oiR5piv5a2X56ym5LiyLCBwIGogZydIZWxsbycsICJBcmUgeW91IE9LIu-8jOi_meS4jeaYr-S4reaWh-OAggpMaW5lMDAyOiB1cmwvYT0_YmFja3VwLTIwMjFfMDFfMjguemlw
************************** 解码字符串 ***************************
Line001: 我是字符串, p j g'Hello', "Are you OK",这不是中文。
Line002: url/a=?backup-2021_01_28.zip
*****************************************************************

results matching ""

    No results matching ""