跳到主要内容

校验(json-schema)

JSON Schema 是一种用于验证和描述 JSON 数据结构的标准, 采用 JSON 格式定义数据结构和约束条件. 它提供灵活的验证规则, 层次化描述, 强大的文档功能及可扩展性, 能够提高数据质量, 简化开发流程

Graphoenix 将 GraphQL 定义自动编译为 JSON Schema, 提供开箱即用, 按需扩展的校验功能

安装

安装 graphoenix-json-schema 模块

repositories {
mavenCentral()
jcenter()
}

dependencies {
implementation 'org.graphoenix:graphoenix-json-schema:0.1.3'

annotationProcessor 'org.graphoenix:graphoenix-json-schema:0.1.3'

// ...
}

配置文件中使用 package.localPackageNames 添加 json-schema 模块

package {
localPackageNames = ["io.graphoenix.jsonschema"]
}

定义 json-shcema

使用 @jsonSchema 注解来定义验证规则

  1. 例: 规定用户名长度在 6 到 12 位之间
"用户"
type User {
"用户ID"
id: ID
"用户名"
name: String! @jsonSchema(minLength: 6, maxLength: 12)
"电子邮箱"
email: String
"联系方式"
phoneNumbers: [String!]
"用户类型"
userType: UserType!
"订单"
orders: [Order!]
}

测试

mutation {
user(
name: "Uma"
email: "uma@example.com"
userType: VIP
phoneNumbers: ["13918124629", "18536492446"]
) {
id
name
email
phoneNumbers
userType
}
}

返回 json-schema 校验错误

{
"errors": [
{
"message": "$.name:必须至少为 6 个字符长",
"locations": null,
"path": ["name"],
"extensions": null
}
]
}
  1. 例: 规定货物最少购买 1 件最多购买 999 件
"订单项"
type OrderItem {
"订单项ID"
id: ID
"产品"
product: Product!
"购买数量"
quantity: Int! @jsonSchema(minimum: 1, maximum: 999)
}

测试

mutation {
order(
items: [
{ product: { where: { id: { opr: EQ, val: "5" } } }, quantity: 1000 }
]
where: { id: { opr: EQ, val: "4" } }
) @merge {
id
items {
id
product {
name
}
quantity
}
}
}

返回 json-schema 校验错误

{
"errors": [
{
"message": "$.items[0].quantity:最大值必须为 999",
"locations": null,
"path": ["items", "0", "quantity"],
"extensions": null
}
]
}

指令说明

@jsonSchema 指令

字段类型说明
minLengthInt字符串最小长度
maxLengthInt字符串最大长度
patternString正则表达式
formatString格式
contentMediaTypeString内容媒体类型
contentEncodingString内容编码
minimumFloat
exclusiveMinimumFloat>
maximumFloat
exclusiveMaximumFloat<
multipleOfFloat倍数
constString常量值
enum[String]枚举值
itemsJsonSchema列表验证
minItemsInt列表最小元素数
maxItemsInt列表最大元素数
uniqueItemsBoolean列表元素唯一性
allOf[JsonSchema]AND
anyOf[JsonSchema]OR
oneOf[JsonSchema]XOR
notJsonSchemaNOT
properties[Property]定义验证字段
ifJsonSchema条件语句
thenJsonSchema条件语句
elseJsonSchema条件语句
dependentRequired[Property]必要依赖

输入类型说明

Property

字段类型说明
nameString!字段名称
validationJsonSchema校验规则
required[String]必须属性

JsonSchema

字段类型说明
minLengthInt字符串最小长度
maxLengthInt字符串最大长度
patternString正则表达式
formatString格式
contentMediaTypeString内容媒体类型
contentEncodingString内容编码
minimumFloat
exclusiveMinimumFloat>
maximumFloat
exclusiveMaximumFloat<
multipleOfFloat倍数
constString常量值
enum[String]枚举值
itemsJsonSchema列表验证
minItemsInt列表最小元素数
maxItemsInt列表最大元素数
uniqueItemsBoolean列表元素唯一性
allOf[JsonSchema]AND
anyOf[JsonSchema]OR
oneOf[JsonSchema]XOR
notJsonSchemaNOT
properties[Property]定义验证字段
ifJsonSchema条件语句
thenJsonSchema条件语句
elseJsonSchema条件语句
dependentRequired[Property]必要依赖