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

2.4.1 只读查询操作

需求 为API提供两个查询操作,一个可以获得所有产品,另一个可以根据产品ID查询到某一个具体的产品。

GraphQL服务一定会提供一个query入口,它表现为schema中的query字段,同时定义一个Query类型,来描述客户端的查询请求。服务器端定义如下:

有了查询操作schema之后,就可以在客户端发送对应的查询操作了,比如客户端想拿到所有商品的id和name,可以发送的请求如下:

GraphQL可以很容易地只请求一个完整对象中的某些特定的字段(Field),比如上面示例中的id和name。可以使用GraphQL自由定制返回数据。

GraphQL查询请求中一定要指定每一个所需的具体字段,如果把数据的结构想象成一棵树的话,需要一路指定到每一片需要的叶子上。如果请求的“叶子”很多,查询就显得很臃肿。对这些臃肿的查询,读者也不要着急,本书后面会介绍一些办法来精炼查询。

开发者需要注意的是,在实际项目中很少会让客户端去服务器端读取所有商品的列表,因为这个列表可能包含过多的数据,一般会给查询所有商品这个操作加上分页的功能,这会在以后的章节里讨论。

上面查询会返回如下的结果:

从上面的查询和结果中可以看出GraphQL的两个优点:

(1)高效:服务器端只会返回客户端实际需要的字段,网络传输负担小,在某些情况下,对数据库的负担也小。

(2)同构:客户端发出的查询和服务器返回的结果结构相同。这样客户端可以完全预知甚至控制所返回数据的结构,不会像RESTful服务那样,对服务器端可能返回的数据结构一无所知,只能参阅API文档。

还可以在查询操作的请求中直接指定参数的值。代码如下:

后面还会介绍使用变量(Variable)来更优雅地传递参数。

动动手:看看上面这个product查询会返回什么样的数据?如果请求一个不存在的商品,又会发生什么?