Kafka Rest Proxy JSON 模式验证
Kafka Rest Proxy JSON schema validation
我想通过 Kafka Rest Proxy 生成一个 kafka 主题。我在模式注册表中创建了一个 JSON 模式,我希望所有消息都根据注册的模式进行验证,如果它们与模式不匹配则拒绝。
我的架构
{
"type": "object",
"properties": {
"foo": {
"type": "string",
},
"bar": {
"type": "number"
}
}
}
此架构已正确注册并分配了版本 1。然后我尝试为 foo
和 bar
生成一条数据类型错误的消息,但消息被接受了。
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"
}
}
]
}'
请注意,我正在生成具有关联架构的 test
主题,但错误的消息无论如何都会被接受。我还尝试添加 "value_schema_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 架构?
是的,这是可能的。您必须按照以下方式将其启用为值、键或两者:
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 标识的架构的消息才会被接受。
希望对您有所帮助。
干杯,
爱德华多·庞佐尼
我想通过 Kafka Rest Proxy 生成一个 kafka 主题。我在模式注册表中创建了一个 JSON 模式,我希望所有消息都根据注册的模式进行验证,如果它们与模式不匹配则拒绝。
我的架构
{
"type": "object",
"properties": {
"foo": {
"type": "string",
},
"bar": {
"type": "number"
}
}
}
此架构已正确注册并分配了版本 1。然后我尝试为 foo
和 bar
生成一条数据类型错误的消息,但消息被接受了。
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"
}
}
]
}'
请注意,我正在生成具有关联架构的 test
主题,但错误的消息无论如何都会被接受。我还尝试添加 "value_schema_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 架构?
是的,这是可能的。您必须按照以下方式将其启用为值、键或两者:
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 标识的架构的消息才会被接受。
希望对您有所帮助。
干杯,
爱德华多·庞佐尼