Рубрики
Без рубрики

JsonBatch — Путь от нуля до полноценного пакетного движка – часть 1

Недавно я опубликовал JsonBatch — движок для выполнения пакетных запросов с помощью REST API на основе JSON. A… Помеченный java, json, batch.

Недавно я опубликовал JsonBatch — движок для выполнения пакетных запросов с помощью REST API на основе JSON. Несмотря на то, что это небольшая библиотека, я счел вполне удовлетворительным пройти через все процессы, начиная с проектирования и заканчивая ее разработкой. Итак, сегодня я хочу поделиться с вами своим путешествием.

I. Идея

Все началось с требования к продукту нашей компании. Чтобы помочь одному из наших пользователей перенести свою собственную систему в нашу систему, нам необходимо предоставить им адаптер, который устранит разрыв между их API-интерфейсами и нашими API-интерфейсами и будет поддерживать его некоторое время, пока они не завершат процесс миграции.

Это обычное требование, но мы хотим каким-то образом использовать его повторно, чтобы нам не приходилось повторять одни и те же работы с другими пользователями. Сначала мы подумали о том, чтобы предоставить пользователю способ настроить, к какой конечной точке будет перенаправляться их API, и как сопоставить наш ответ с их ответом. Довольно прямолинейно, но реальность не так проста. Из-за разной конструкции 2 систем их API в основном придется вызывать несколько запросов, а затем агрегировать все ответы.

Вот тогда-то мне и пришла в голову идея. Что нам нужно, так это пакетный движок, который можно легко и динамически настраивать.

ii. Первый прототип

Таким образом, для пакетного движка он должен принимать список запросов, выполняться последовательно и собирать все ответы.

Логика выполнения проста, но здесь возникает первая проблема: Как создать тело запроса? Это легко, если клиент может предоставить все тела запросов, но что, если тело запроса требует данных из ответа на другой запрос? Движку нужен способ узнать, как и где извлекать данные. Потому что все запросы и ответы будут в формате JSON, поэтому, если вы хотите найти поле, первый ответ, который пришел ко мне, – это использование JSONPath. К счастью, в Java уже есть хорошая библиотека Jayway JSONPath , который поддерживает все мои потребности.

Итак, теперь мы закончили с Как вопрос, следующий вопрос Где . Решение, которое я придумал, заключается в создании большого JSON, содержащего все запросы и ответы. Что-то вроде этого:

{
 "original": {
   "http_method": "...",
   "url": "...",
   "headers": {
     "header_1": [ "..." ],
     "header_2": [ "..." ],
     ...
   },
   "body": { ... }
 },
 "requests": [
     {
       "http_method": "...",
       "url": "...",
       "headers": {
         "header_1": [ "..." ],
         "header_2": [ "..." ],
         ...
       },
       "body": { ... }
     },
     ...
 ],
 "responses": [
     {
       "status": ...,
       "headers": {
         "header_1": [ "..." ],
         "header_2": [ "..." ],
         ...
       },
       "body": { ... }
     },
     ...
 ]
}

При этом остается только 1 проблема: нам нужен формат схемы, чтобы дать команду движку создать фактическое тело JSON. Быстрый поиск и я обнаружил схему JSON. Но после некоторых исследований я думаю, что схема JSON больше подходит для проверки, чем для генерации, и формат схемы имеет структуру, которая сильно отличается от фактического JSON. Так что мне остается разработать свою собственную пользовательскую схему.

Проведя несколько экспериментов, я пришел к простой, но достаточно хорошей схеме. Схема такая же, как и в реальном JSON, но только поле string имеет определенный формат. Например:

{
  "field_1": 1,
  "field_2": "int $.responses[0].body.field_a",
  "field_3": "int[] $.responses[*].body.field_a"
}

С помощью этой схемы движок создаст JSON с:

  • поле_1
  • field_2 является целым числом и извлекает значение из JSONPath: $.responses[0].body.field_a
  • field_3 является целочисленным массивом и извлекает значение из JSONPath: $.responses[*].body.field_a

Фактический JSON будет выглядеть так:

{
  "field_1": 1,
  "field_2": 2,
  "field_3": [2, 3, 4]
}

Вы можете видеть, что структура schema & actual очень похожа.

Теперь, после того, как все части собрались вместе, мне потребовалось около 1 недели, чтобы закодировать этот первый прототип. В следующей части я расскажу о том, как этот прототип продолжает развиваться.

Первоначально опубликовано на Первоначально опубликовано на

Оригинал: “https://dev.to/rey5137/jsonbatch-journey-from-zero-to-full-fledged-batch-engine-part-1-578o”