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
*****************************************************************