GraphQL实战:写给全栈工程师们
上QQ阅读APP看书,第一时间看更新

2.3.3 标量类型

在了解自定义类型之前,我们先来看一下GraphQL本身就提供的标量类型。GraphQL使用标量类型来表达数字、布尔值和字符串等基本数据类型。

✓ Int整型

用于表达2,5,42,-1等没有小数点的数字。一般GraphQL的前后端会使用32位二进制的整型来存储GraphQL的整型数字。对于用户输入和结果集中超过范围的过大整数,GraphQL会报错。

✓ Float浮点型

用于表达3.12,4.5等有小数点的数字。有开发经验的读者可能会问,浮点小数的精度是怎么样的呢?这是非常好的问题,但无法给出一个确定的答案,因为这取决于GraphQL的前后端实现语言。一般地,认为这是一个双精度浮点型[6],也就是很多编程语言的Double类型。

✓ String字符串型

用于表达“hello world!”、“beinan”这样的字符串。GraphQL协议本身并没有对字符串长度的最大值有一个限定,但读者要注意GraphQL数据是通过Http协议传递的,很多语言和框架会对Http的请求和响应长度有所限制,太长的字符串容易造成错误。

根据GraphQL官方规范的说法,字符串类型用来表达人类可读的文字内容。在GraphQL中,一般使用UTF-8编码。所以对于使用其他编码的老旧后端系统,需要注意乱码的问题。

✓ Boolean布尔型

用来表达真或者假也就是true或者false这两种布尔值。现在的编程语言和数据库一般都是内建布尔值的。为了让语义更明确,结果更具可读性,尽量不要使用1或者0来代替true或者false。

✓ ID标识符型

在语义上用来表达唯一标识符,但在实现和数据传输中,把ID序列化成String的形式。官方规范强调,ID和String不同,因为ID不是人类可读的。

有的读者可能会问,如果数据库里的ID是数字,怎么办?其实不需要进行任何额外的处理,GraphQL会自动把数字ID转换成String形式的ID返回给客户端。

以上的标量类型具有不可分割的特性,要请求某个标量数据,GraphQL就会完全返回给客户端,客户端不能觉得某个字符串太长,就只要服务器返回一部分字符串(很容易通过其他方式来实现这个需求,但GraphQL字符串标量本身并不支持)。

还有一点需要注意的是,GraphQL支持标量的自动类型转换。

如果GraphQL自带的标量不够用怎么办?其实可以使用自定义的标量来扩展GraphQL的标量系统。

例如:

系统自带的标量和用户自定义的标量都可以表示为字符串,这很好理解,也很容易支持,数字1可以表示为“1”,布尔值true可以表示为“true”。但反过来就不一定行,“2@5”就不能表示成一个Int或者Float。

所以自定义标量类型更多是从语义的层面来设计的。数据在实际传输过程中,往往就是个普通的字符串,但在服务器端和客户端,代码需要保证Date就是一个遵循日期格式的字符串,而Email一定是个合法的电子邮件地址。

开发者可以通过这些自定义标量更容易地和数据库存储类型结合,比如Date可以定义为Sql数据库的日期类型。