📅  最后修改于: 2023-12-03 14:41:37.934000             🧑  作者: Mango
GraphQL 标量是 GraphQL 中的一种数据类型,它表示一个单值(即不可拆分的值),比如整数、字符串等。在 Scala 中,我们可以通过自定义 GraphQL 标量来扩展 GraphQL 的默认数据类型。
在 Scala 中,我们可以通过定义一个类继承 ScalarType
类来创建自定义的 GraphQL 标量。下面是一个创建自定义标量 DateTime
的示例代码:
import sangria.schema.ScalarType
import sangria.ast._
import sangria.validation.{ValueCoercionViolation, IntCoercionViolation}
import scala.util.{Try, Success, Failure}
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
case object DateTimeType extends ScalarType[LocalDateTime]("DateTime") {
override def coerceOutput(dateTime: LocalDateTime, typeTag: ScalarType[Any]): Any =
dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
override def coerceInput(input: Any): Try[LocalDateTime] = input match {
case s: String => Try(LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME))
case _ => Failure(DateTimeCoercionViolation)
}
override def coerceUserInput(input: Any): Try[LocalDateTime] = input match {
case s: String => Try(LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME))
case _ => Failure(DateTimeCoercionViolation)
}
}
case object DateTimeCoercionViolation extends ValueCoercionViolation("DateTime value expected")
上面代码中,我们创建了一个名为 DateTime
的标量类型,并重写了三个方法:
coerceOutput
:用于将 LocalDateTime
类型转换为 GraphQL 输出值。coerceInput
:用于将输入的值转换为 LocalDateTime
类型。coerceUserInput
:用于将用户输入的值转换为 LocalDateTime
类型。我们可以将上面创建的标量类型注册到 GraphQL Schema 中,从而在 GraphQL 查询中使用它。下面是一个示例代码:
import sangria.schema._
val MySchema = Schema(
query = QueryType,
mutation = None,
subscription = None,
additionalTypes = Seq(DateTimeType)
)
上面代码中,我们将 DateTimeType
添加到了 additionalTypes
中,使其成为了 Schema 的一部分。
创建和注册标量类型之后,我们可以在 GraphQL 查询中使用它。下面是一个查询示例:
query {
search(start: "2022-01-01T00:00:00", end: "2022-01-31T23:59:59") {
id
title
createdAt(type: DateTime)
}
}
上面的查询中,我们使用了自定义的 DateTime
标量类型来表示 createdAt
字段的值。在执行查询时,GraphQL 引擎会自动调用 coerceOutput
方法将 LocalDateTime
类型转换为字符串类型。
通过创建自定义的 GraphQL 标量类型,我们可以扩展 GraphQL 的默认数据类型,并在 GraphQL 查询中使用它。在 Scala 中,我们可以通过继承 ScalarType
类来创建自定义标量类型,并在 Schema 中注册它。