校验(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
注解来定义验证规则
- 例: 规定用户名长度在 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 件最多购买 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 指令
字段 | 类型 | 说明 |
---|---|---|
minLength | Int | 字符串最小长度 |
maxLength | Int | 字符串最大长度 |
pattern | String | 正则表达式 |
format | String | 格式 |
contentMediaType | String | 内容媒体类型 |
contentEncoding | String | 内容编码 |
minimum | Float | ≥ |
exclusiveMinimum | Float | > |
maximum | Float | ≤ |
exclusiveMaximum | Float | < |
multipleOf | Float | 倍数 |
const | String | 常量值 |
enum | [String] | 枚举值 |
items | JsonSchema | 列表验证 |
minItems | Int | 列表最小元素数 |
maxItems | Int | 列表最大元素数 |
uniqueItems | Boolean | 列表元素唯一性 |
allOf | [JsonSchema] | AND |
anyOf | [JsonSchema] | OR |
oneOf | [JsonSchema] | XOR |
not | JsonSchema | NOT |
properties | [Property] | 定义验证字段 |
if | JsonSchema | 条件语句 |
then | JsonSchema | 条件语句 |
else | JsonSchema | 条件语句 |
dependentRequired | [Property] | 必要依赖 |
输入类型说明
Property
字段 | 类型 | 说明 |
---|---|---|
name | String! | 字段名称 |
validation | JsonSchema | 校验规则 |
required | [String] | 必须属性 |
JsonSchema
字段 | 类型 | 说明 |
---|---|---|
minLength | Int | 字符串最小长度 |
maxLength | Int | 字符串最大长度 |
pattern | String | 正则表达式 |
format | String | 格式 |
contentMediaType | String | 内容媒体类型 |
contentEncoding | String | 内容编码 |
minimum | Float | ≥ |
exclusiveMinimum | Float | > |
maximum | Float | ≤ |
exclusiveMaximum | Float | < |
multipleOf | Float | 倍数 |
const | String | 常量值 |
enum | [String] | 枚举值 |
items | JsonSchema | 列表验证 |
minItems | Int | 列表最小元素数 |
maxItems | Int | 列表最大元素数 |
uniqueItems | Boolean | 列表元素唯一性 |
allOf | [JsonSchema] | AND |
anyOf | [JsonSchema] | OR |
oneOf | [JsonSchema] | XOR |
not | JsonSchema | NOT |
properties | [Property] | 定义验证字段 |
if | JsonSchema | 条件语句 |
then | JsonSchema | 条件语句 |
else | JsonSchema | 条件语句 |
dependentRequired | [Property] | 必要依赖 |