GraphQL 是一种用于 API 的查询语言,通过定义类型和字段来指定需要返回的数据,并且允许客户端对返回数据进行精确的控制。在 GraphQL 中,我们可以为每个字段定义参数,以便更加灵活地获取我们所需要的数据。本文将详细介绍 GraphQL 中字段参数的用法。
定义字段参数
在 GraphQL 中定义字段参数非常简单,只需要在字段后面加上一对圆括号括起来的参数列表即可。例如:
type Query { user(id: ID!): User! }
在上面的例子中,我们定义了一个 Query
类型,其中包含一个 user
字段。该字段接收一个 id
参数,并返回一个 User
类型的值。
参数列表可以包含多个参数,每个参数都包含一个名称和一个类型。例如,下面的例子定义了一个 add
字段,该字段接收两个整数参数 a
和 b
,并返回它们的和:
type Query { add(a: Int!, b: Int!): Int! }
参数类型
在 GraphQL 中,每个参数都必须有一个类型。参数类型可以是 GraphQL 的内置类型,也可以是我们自己定义的类型。
内置类型
GraphQL 中内置了一些常见的数据类型,如字符串,整数,浮点数,布尔值等。这些类型可以直接在参数的类型定义中使用,例如:
type Query { search(query: String!): [Result!]! paginate(page: Int!, perPage: Int!): [Item!]! }
在上面的例子中,search
字段接收一个字符串类型的 query
参数,paginate
字段接收两个整数类型的参数 page
和 perPage
。
自定义类型
在 GraphQL 中,允许我们自定义类型。对于对象类型的参数,我们可以使用已定义的类型,或者是自定义的类型。例如:
type Query { user(id: ID!): User! } type User { name: String! age: Int! }
在上面的例子中,Query
类型包含了一个 user
字段,该字段接收一个 id
参数,并返回一个 User
类型的值。我们在 User
类型定义中包含了 name
和 age
两个字段。
除了对象类型,我们还可以自定义枚举类型和输入类型。例如,下面的例子定义了一个枚举类型和一个输入类型:
-- -------------------- ---- ------- ---- --------- - --- ---- - ----- --------------- - ----- ---- -------- ---- -------------- ---------- - ---- ----- - --------------- ------------------ -------- -
在上面的例子中,我们定义了一个枚举类型 Direction
,指定了排序的方向;另外我们还定义了一个输入类型 PaginationInput
,该类型包含了需要的参数信息;paginate
字段接收一个 PaginationInput
类型的输入参数,返回一个 [Item!]
类型的结果数组。
可选参数
在 GraphQL 中,参数可以指定为可选参数。可选参数指的是当该参数没有传入时,将使用默认值。例如:
type Query { search(query: String = "", limit: Int = 10): [Result!]! }
在上面的例子中,search
字段接收两个可选参数 query
和 limit
,默认分别为 ""
和 10
。
参数默认值
在 GraphQL 中,我们可以为参数指定默认值。例如:
type Query { search(query: String = "", limit: Int): [Result!]! }
在上面的例子中,search
字段接收两个参数,一个可选的 query
参数,默认为 ""
,一个必选的 limit
参数。如果没有传入 limit
参数,则会抛出一个错误。
参数指令
在 GraphQL 中,我们可以使用参数指令对参数进行精细的控制。例如:
type Query { search(query: String @trim, limit: Int! @positive): [Result!]! }
在上面的例子中,search
字段接收两个参数,一个 query
参数和一个必选的 limit
参数。对于 query
参数,我们使用了 @trim
指令,该指令将在查询前去除参数值的前后空格;对于 limit
参数,我们使用了 @positive
指令,该指令将在查询前检查参数值是否为正整数,否则将抛出一个错误。
示例代码
下面是一个类似于 GitHub API 的示例代码,展示了 GraphQL 中参数的用法:
-- -------------------- ---- ------- ---- ----- - ----------------- -------- ----- --------- ---------- - ---- ---------- - --- --- ----- ------- ------------ ------ ---------------- ------------- --------- - ---- ---------- - ---- ------ - ----- ----------- - ------ ---------- ---------- ------ ------------- -------- -------------- -------- - ---- ----- - --- --- ------ ------- ------ ----------- ---------- --------- ---------- ----- - ---- ---- - ------ ------- ----- ------- ------ ------ - ------ --------
在上面的例子中,我们定义了一个 Query
类型,其中包含一个 repository
字段,该字段接收两个必选参数 owner
和 name
,并返回一个 Repository
类型的值。
我们在 Repository
类型定义中定义了一个 issues
字段,该字段包含一个 IssueFilter
类型的参数。我们在 IssueFilter
类型定义中定义了 state
,createdBy
,createdAfter
和 createdBefore
四个可选参数,用于过滤查询结果。
在 Issue
类型定义中,我们将一个枚举类型 IssueState
和一个自定义类型 User
作为参数使用。
结论
在 GraphQL 中,通过使用字段参数,我们可以更加灵活地获取我们所需的数据,并且可以使用参数指令对参数进行精细的控制。本文介绍了 GraphQL 中字段参数的用法,并提供了示例代码,希望对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67134a74ad1e889fe20bd549