Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用Fastify和AJV验证请求架构 背景_Json_Validation_Jsonschema_Ajv - Fatal编程技术网

Json 使用Fastify和AJV验证请求架构 背景

Json 使用Fastify和AJV验证请求架构 背景,json,validation,jsonschema,ajv,Json,Validation,Jsonschema,Ajv,我正在用Fastify构建一个API,这是我第一次使用JSON模式验证。这样做的目的是,它既可以提高服务器代码的效率,也可以帮助开发人员了解如何使用我的API 问题 我正在尝试验证一个路由,该路由允许客户端仅按名称查询小猫。一个成功形成的查询看起来像/kittens?name=fluffykins 我的此路由架构如下所示: { querystring: { type: 'object', name: { type: 'string' }, } } 问题: 如何使我的模式

我正在用Fastify构建一个API,这是我第一次使用JSON模式验证。这样做的目的是,它既可以提高服务器代码的效率,也可以帮助开发人员了解如何使用我的API

问题 我正在尝试验证一个路由,该路由允许客户端仅按名称查询小猫。一个成功形成的查询看起来像
/kittens?name=fluffykins

我的此路由架构如下所示:

{
  querystring: {
    type: 'object',
    name: { type: 'string' },
  }
}
问题: 如何使我的模式验证器只接受
name
上的查询,并拒绝其他查询,如
/kittens?age=1
?我的首选是模式验证器独立于控制器代码来处理它,并支持我们将来可能添加的查询


谢谢

当我向SO发帖时,我会很快找到答案。以下是对我有效的方法,但我仍然有兴趣听到是否有其他更好的方法来做到这一点

{
  querystring: {
    type: 'object',
    properties: {
        name: { type: 'string' }
    },
    anyOf: [
      {
        required: [ 'name' ]
      }
    ],
  },
}

我不太清楚您想用
anyOf
做什么,所以我可能遗漏了一些东西,但我相信这正是您想要的(如果您使用的是draft-06或更高版本):

propertyNames
确保
name
是唯一可接受的属性。您也可以通过设置
“AdditionInalProperties”:false来实现这一点(如果您使用的是draft-04,则必须这样做,因为它不支持
propertyNames
)。但是当您尝试组合模式时,这样做可能会导致意外问题,因此如果您可以使用draft-06
propertyNames
,则更加灵活

以下是草稿-04版本:

{
    "type": "object",
    "required": ["name"],
    "properties": {
        "name": {"type": "string"}
    },
    "additionalProperties": false
}
{
    "type": "object",
    "required": ["name"],
    "properties": {
        "name": {"type": "string"}
    },
    "additionalProperties": false
}