当前位置: 首页 > 知识库问答 >
问题:

Kafka Rest Proxy JSON模式验证

赖绪
2023-03-14

我想通过KafkaRest代理产生一个Kafka主题。我已经在模式注册表中创建了一个JSON模式,我希望所有消息都根据注册的模式进行验证,如果它们与模式不匹配,则拒绝。

我的模式

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "string",
    },
    "bar": {
      "type": "number" 
    }
  }
}

此架构已正确注册并分配了版本1。然后我尝试为foobar生成一个数据类型错误的消息,但是消息被接受。

curl --location --request POST 'http://localhost:8082/topics/test' \
--header 'Content-Type: application/vnd.kafka.jsonschema.v2+json' \
--header 'Accept: application/vnd.kafka.v2+json' \
--data-raw '{
    "value_schema_id": 1,
    "records": [
        {
            "value": {
                "foo": 10,
                "bar":"not a number"
            }
        }
    ]
}'

请注意,我正在生成一个与模式关联的测试主题,但是错误消息get无论如何都会被接受。我还尝试添加“value\u schema\u id”:1,以确保有效负载中引用了该模式,但仍然接受错误消息。

但是,如果我将JSON模式传递为value_schema,它会按预期工作

{
    "value_schema": "{\"type\": \"object\",\"properties\": {\"foo\": {\"type\": \"string\"},\"bar\": {\"type\": \"number\"}}}",
    "records": [
        {
            "value": {
                "foo": "10",
                "bar": "1"
            }
        }
    ]
}

回答

{
    "error_code": 42203,
    "message": "Conversion of JSON to Object failed: Failed to convert JSON using JSON Schema: #/bar: expected type: Number, found: String"
}

问题:在生成消息时是否可以引用现有的模式id,而不必每次都传递整个JSON模式?


共有1个答案

白祺然
2023-03-14

是的,有可能。您必须按照以下要求将其启用为值、键或两者:

confluent.value.schema.validation=true 
confluent.key.schema.validation=true

此外,在JSON请求中,您可以指定模式的ID。以下面的例子为例,来说明我所说的:

{
  "key_schema_id": 1234,
  "value_schema_id: 56789,
  "records": [
    {
      "key": "key123",
      "value": "my_simple_string_value_example"
    }
  ]
}

在哪里:

key_schema_id

是架构注册表中键架构的ID。通过为其设置适当的值,将保证只接受具有与该ID标识的架构兼容的密钥的消息。

同样:

value_schema_id

是架构注册表中值架构的ID。通过设置适当的值,它将保证只接受具有与该ID标识的模式兼容的值的消息。

希望这能给我们带来一些启示。

干杯

爱德华多·庞佐尼

 类似资料:
  • 我正在使用Spring数据卡桑德拉连接到我的卡桑德拉数据库。我已经创建了实体java对象(带有@Table注释),以便从数据库中进行一些简单的提取。 我想知道如何在启动时进行模式验证,比如像在Hibernate中那样。 请注意,我阅读了有关查询验证的信息,但我对验证表名和列名感兴趣。

  • 根据Avro模式规范(适用于接头):https://avro.apache.org/docs/current/spec.html 如上所述,Unions使用JSON数组表示。例如,["null","string"]声明一个模式,该模式可以是null或string。 ( 请注意,当为类型为联合的记录字段指定默认值时,默认值的类型必须与联合的第一个元素匹配。 因此,对于包含“null”的联合,通常首先

  • 我试图使用另一个JSON模式来验证JSON模式。 要验证的JSON模式示例:https://jsonschema.net/home 验证上述模式的验证模式参考:https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-draft-07.json 从上面的中,如果我删除,我的JSON将变得无效。 我有什么方法可以定义根

  • 我在验证JSON时遇到了一些错误。我无法理解这些错误,有人能帮我解释一下吗。 } 这是json。 消息:JSON与“anyOf”中的任何模式都不匹配。架构路径: 消息:无效类型。应为数组,但得到的是字符串。架构路径: 消息:值“标识”载体“未在枚举中定义。架构路径: 消息:字符串“uui # abb 0 ef 56-8562-4056-aa62-AFB 758 a 150 ad”未根据格式“uri

  • 问题内容: 我使用Spring 4.3.3.RELEASE,Hibernate 5.2.2.Final,数据库是MySQL。我想尝试一下 strategy = GenerationType.TABLE 。正如我对 GenerationType.SEQUENCE 所知, 我需要数据库中的序列来生成ID。 这是我的实体。 Spring注解配置 Spring xml配置 当我运行我的应用程序时,我得到

  • 我有一个表单,如果复选框为false,则使用ng必需指令对文本输入进行验证。如果复选框为true,则该字段将被隐藏并且ng必需设置为false。 问题是,我在输入上还指定了一个用于验证的正则表达式,并且使用了ng模式角度指令。我遇到的问题是,如果用户填写了无效的电话号码,请选中该框以停用该输入(因此无需进一步验证),表单将不允许提交,因为它基于ng模式无效。 我试图通过添加一个ng change函