📜  GraphQL |标量

📅  最后修改于: 2022-05-13 01:56:33.958000             🧑  作者: Mango

GraphQL |标量

标量是 GraphQL 类型系统的内容。 GraphQL 标量是 GraphQL 文档中的每个字段最终解析为的值类型。它是存储单个值的原始数据类型。 GraphQL 中有五个内置标量,但您也可以定义自定义标量。

内置标量:标量类型表示 GraphQL 类型系统中的原始叶值。 GraphQL 响应采用分层树的形式;这些树上的叶子是 GraphQL 标量。

  • int:表示32位有符号整数数值。作为 Int 响应的服务器应该使用这个 Int 规范。
  • float:表示双精度有符号小数值。定义此规范时,使用 IEEE 754 标准。
  • 字符串:它表示 UTF-8 编码的文本。
  • 布尔值:此标量为真或假。
  • id:用于识别(作为密钥)数据的唯一标识符。 ID 被视为字符串以进行序列化。序列化在这里将对象转换为布尔值、数字或字符串。

示例: GraphQL Scalar 的结构。

  • 询问:
    {
      pokemon {
        name
        pokemonDetails
      }
    }
  • 输出:
    {
     "data": {
       "pokemon": {
          "name":"Bulbasaur",
          "pokemonDetails": {
             "typePokemon":"land",
             "levelPokemon":3
           }
        }
      }
    }

GraphQL 标量有 3 种方法。这些方法的目的是在数据在客户端和服务器之间传输之前对其进行识别和验证。

  • 验证:客户端和服务器之间传递的数据被验证为特定类型,以便接收者可以正确处理它。此验证应放置在需要此类验证的所有适当点上。 ( <-validator media <-validator<-client )
  • 序列化:在传输数据之前,对其进行序列化以转换为适合传输的类型。例如,包含学生详细信息的复杂 JSON 对象被序列化为字符串,然后发送。
  • 解析:当接收到数据(由发送方序列化)时,对其进行解析以将其转换为适当的形式。例如,一个 Date 对象被发送者序列化并发送给接收者。接收者然后对其进行解析以将其转换回 Date 对象。

方法箭头图

自定义标量: GraphQL 使开发人员能够根据自己的需要定义自定义标量。我们可以像下面这样声明一个自定义标量并将其添加到模式中。要定义您自己的标量,必须从头开始编写验证、序列化和解析器。还有一个很棒的包,称为 graphql-scalars 可供使用,其中包含可能需要的常见标量。

  • 句法:
    scalar customScalar

示例:现在,让我们看看这些标量如何发挥作用的一些示例。为了演示,我们将使用下面的 schema.js 文件来执行此任务。

  • 架构.js:
    type Attack {
      name: String
      type: String
      damage: Int
    }
    
    type Pokemon {
      id: ID!
      number: String
      name: String
      weight: PokemonDimension
      height: PokemonDimension
      classification: String
      types: [String]
      resistant: [String]
      attacks: PokemonAttack
      weaknesses: [String]
      fleeRate: Float
      maxCP: Int
      evolutions: [Pokemon]
      evolutionRequirements: PokemonEvolutionRequirement
      maxHP: Int
      image: String
    }
    
    type PokemonAttack {
      fast: [Attack]
      special: [Attack]
    }
    
    type PokemonDimension {
      minimum: String
      maximum: String
    }
    
    type PokemonEvolutionRequirement {
      amount: Int
      name: String
    }
    
    type Query {
      query: Query
      pokemons(first: Int!): [Pokemon]
      pokemon(id: String, name: String): Pokemon
    }
  • 输出:

标量特性:

  • 在大多数情况下,GraphQL 标量有助于 GraphQL 引擎的基本功能。他们通过为可以在服务器和客户端之间传输的“字段”提供五种基本“值类型”来做到这一点。这些基本类型是:Int、Float、String、Boolean 和 ID。
  • 对于稍微复杂一点的软件,GraphQL 为程序员提供了定义“自定义标量类型”以更好地处理“GraphQL 操作”的能力(在效率、有效性和安全性方面)
  • GraphQL 内置标量也有一个 'id' 值类型,可用于唯一标记每个数据记录。
  • GraphQL 标量用于构建模式,作为从数据库中检索数据的模型。

参考: https://graphql-ruby.org/type_definitions/scalars.html