本书“ GraphQL:现代Web应用程序的查询语言”

图片 嗨,habrozhiteli! 我们已经出版了有关GraphQL查询语言的书。 我们决定分享“ GraphQL查询的解剖”一章的翻译内容

Snowtooth是一个虚构的滑雪胜地。 为了本章中的示例,我们将假装这是一座真正的山,我们在那里工作。 我们将研究Snow Fang网站团队如何使用GraphQL提供实时信息:有关滑雪缆车和滑雪道状态的信息。 Snow Fang Ski Patrol可以直接通过智能手机打开和关闭滑雪缆车和滑雪道。 要遵循本章中的示例,请参考GraphQL Playground平台(snowtooth.moonhighway.com/)上的Snow Fang界面。


您可以使用查询操作从API查询数据。 该查询描述了您要从GraphQL服务器接收的数据。 提交请求时,您需要按字段请求数据单位。 这些字段显示在您从服务器收到的JSON数据响应的同一字段中。 例如,如果您发送allLifts请求并请求名称和状态字段,则应获得一个JSON响应,其中包含一个allLifts数组以及每个电梯的名称和状态字符串,如下所示:

query { allLifts { name status } } 

错误处理
成功的请求将返回一个包含数据密钥的JSON文档。 失败的请求将返回包含错误密钥的JSON文档。 发生错误的详细信息在此密钥下作为JSON数据传输。 JSON响应可以同时包含“数据”和“错误”。

您可以将多个查询添加到查询文档中,但是一次只能启动一个操作。 例如,您可以在查询文档中放置两个查询操作:

 query lifts { allLifts { name status } } query trails { allTrails { name difficulty } } 

当您单击播放按钮时,GraphQL Playground会提示您选择这两个操作之一。

如果要针对所有指定数据发送一个请求,则需要将所有内容放入同一请求中:

 query liftsAndTrails { liftCount(status: OPEN) allLifts { name status } allTrails { name difficulty } } 

这是GraphQL的好处。 我们可以在一个请求中接收不同类型的数据。 我们按状态请求一次liftCount,这使我们能够找出当前具有该状态的电梯数量。 我们还要求每个电梯的名称和状态。 最后,我们要求每个跟踪的名称和状态。

查询是GraphQL的一种。 我们将其称为根类型,因为它是映射到操作的类型,而操作是查询文档的根。 在此API模式中定义了GraphQL API中可用于查询的字段。 该文档指出了哪些字段可用于查询类型中的选择。

该文档告诉我们,调用此API时,我们可以选择liftCount,allLifts和allTrails字段。 它还定义了更多可供选择的字段,但要求的重点是我们可以选择所需的字段和需要省略的字段。

编写查询时,我们选择所需的字段,将其括在花括号中。 这些块称为样本。 我们在选择中定义的字段与GraphQL类型直接相关。 字段liftCount,allLifts和allTrails在查询类型中定义。

您可以相互嵌入许多选择。 由于allLifts字段返回一个Lift列表,因此我们需要使用花括号为该类型创建一个新选择。 我们可以请求有关电梯的各种数据,但是在此示例中,我们仅需要电梯的名称和状态。 同样,allTrails请求将返回Trail类型。

JSON响应包含我们请求的所有数据。 此数据被格式化为JSON,并以与我们的请求相同的形式提供。 每个JSON字段的名称都与示例中的字段相同。 我们可以通过指定别名来更改请求中响应对象中的字段名称,如下所示:

 query liftsAndTrails { open: liftCount(status: OPEN) chairlifts: allLifts { liftName: name status } skiSlopes: allTrails { name difficulty } } 

以下是答案:

 { "data": { "open": 5, "chairlifts": [ { "liftName": "Astra Express", "status": "open" } ], "skiSlopes": [ { "name": "Ditch of Doom", "difficulty": "intermediate" } ] } } 

现在,我们以相同的形式返回数据,但是在答案中,我们重命名了几个字段。 过滤GraphQL查询结果的一种方法是传递查询参数。 参数是与请求字段关联的一对键值(或对)。 如果仅需要封闭式升降机的名称,我们可以发送一个参数来过滤答案:

 query closedLifts { allLifts(status: "CLOSED" sortBy: "name") { name status } } 

您还可以使用参数选择数据。 例如,假设我们需要请求单个索道的状态。 我们可以通过其唯一标识符选择电梯:

 query jazzCatStatus { Lift(id: "jazz-cat") { name status night elevationGain } } 

在这里,我们看到答案包含Jazz Cat缆车的名称,状态,夜间和海拔高度。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录

小贩优惠券可享受25%的折扣-GraphQL

支付纸质版本的书后,将通过电子邮件发送该书的电子版本。

Source: https://habr.com/ru/post/zh-CN441194/


All Articles