我们一直在使用Avro IDL定义在Kafka后端上使用的消息集,对此感到非常满意。我们还想将JSON
绑定到具有Avro Schema的Python Flask应用上的REST api上,并且遇到了一些困难。
那里有各种各样的软件包,但是我还没有找到可以按照我需要的方式工作的软件包。我希望获得一些指导。
我可以使用以下文件来获取我的avdl
文件并生成一组avsc
文件:
avro-tools idl2schemata message.avdl output_dir
或
avro-tools idl message.avdl > output_dir/schema.avsc
我能够用python读取这些内容,但是我发现没有什么“简单”的内容可以告诉我JSON输入是否与模式匹配。
有人做过类似的事情吗?我走错了路吗?任何建议将不胜感激。
我知道如果我在SpringBoot领域玩游戏,那可能很简单。
谢谢
@namespace("org.jeeftor.avro")
protocol TacoRequest {
enum MeatType{
CHICKEN,
BEEF,
TURKEY,
FISH
}
enum CheeseType {
GROSS_VEGAN,
ACTUAL_COW_CHEESE,
GOAT_CHEESE
}
enum Toppings {
LECHUGA,
TOMATO,
SAUCE
}
record Taco {
MeatType meat;
CheeseType cheese;
array<Toppings> toppings;
}
record Order {
union { string, int } order_id;
array<Taco> tacos;
}
}
我通过以下方式生成模式:avro-tools idl order.avdl protocol.avpr
{
"protocol" : "TacoRequest",
"namespace" : "org.jeeftor.avro",
"types" : [ {
"type" : "enum",
"name" : "MeatType",
"symbols" : [ "CHICKEN", "BEEF", "TURKEY", "FISH" ]
}, {
"type" : "enum",
"name" : "CheeseType",
"symbols" : [ "GROSS_VEGAN", "ACTUAL_COW_CHEESE", "GOAT_CHEESE" ]
}, {
"type" : "enum",
"name" : "Toppings",
"symbols" : [ "LECHUGA", "TOMATO", "SAUCE" ]
}, {
"type" : "record",
"name" : "Taco",
"fields" : [ {
"name" : "meat",
"type" : "MeatType"
}, {
"name" : "cheese",
"type" : "CheeseType"
}, {
"name" : "toppings",
"type" : {
"type" : "array",
"items" : "Toppings"
}
} ]
}, {
"type" : "record",
"name" : "Order",
"fields" : [ {
"name" : "order_id",
"type" : [ "string", "int" ]
}, {
"name" : "tacos",
"type" : {
"type" : "array",
"items" : "Taco"
}
} ]
} ],
"messages" : { }
}
我的问题是如何轻松使用此“模式”来验证输入。