Avro IDL для проверки правильности ввода Rest Api в python - PullRequest
0 голосов
/ 14 июня 2019

Мы использовали Avro IDL для определения наборов сообщений, используемых на нашей серверной части Kafka, и нам это очень нравится. Мы также были заинтересованы в проверке JSON API REST в приложении Python Flask со схемой Avro, и столкнулись с некоторыми трудностями.

Существует множество пакетов, но мне еще предстоит найти что-то, что явно работает так, как мне нужно. Я надеюсь на какое-то руководство.

Я могу взять мой avdl файл и сгенерировать набор avsc файлов с:

avro-tools idl2schemata message.avdl output_dir

или

avro-tools idl message.avdl > output_dir/schema.avsc

И я могу читать их на python, но я не нашел ничего «легкого», что могло бы просто сказать мне, соответствует ли мой ввод JSON схеме.

Кто-нибудь делал что-то подобное? Я иду по неверному пути? Любой совет будет оценен спасибо.

Я знаю, если бы я играл на земле SpringBoot, это было бы ОЧЕНЬ просто.

Спасибо

IDL

@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" : { }
}

У меня вопрос, как легко использовать эту «схему» для проверки ввода.

...