Как создать swagger3 (OpenAPI3) spe c in (.json / .yaml) из файлов protobuf (.proto)? - PullRequest
0 голосов
/ 21 апреля 2020

Мой оригинальный вариант использования:

Я создаю приложение в GO с сервером gRPC (используя protobuf) и помещаю его в сервер HTTPS (используя gin) , Только HTTPS-сервер публикуется для использования клиентами (под этим я подразумеваю, что мое приложение может быть доступно через REST API, которое фактически затем набирает номер на конечной точке gRP C), и я публикую его с использованием Swagger OpenAPI3 (версия 3 является основным требованием здесь) спецификация. Требуется и gRP C, и HTTPS, и любое решение должно соответствовать этой архитектуре.

Я не хочу поддерживать свою спецификацию сервера в двух местах, то есть я не хочу поддерживать оба протокола файлы (.proto) и чванство spe c (.json/.yaml). Поскольку мне абсолютно необходимо писать прототипы для создания сервера gRP C, я хочу автоматизировать генерацию swagger spe c (OpenAPI3).

Где я нахожусь:

Я могу для генерации swagger OpenAPI2 spe c из файлов protobuf (.proto) с использованием библиотеки grp c -gateway примерно так: grp c -rest- go - пример . Но мое требование - OpenAPI3; более конкретно, я хочу использовать функцию oneOf в OpenAPI3 и сопоставить ее с функцией oneof протокола proto. Это невозможно с OpenAPI2, поскольку он не позволяет API иметь тело запроса / ответа с определениями нескольких типов, что было функцией, добавленной в OpenAPI3 путем включения конструкций oneOf, anyOf и allOf.

При попытке сделать это я наткнулся на эту библиотеку с помощью GoogleAPIs googleapis / gnosti c, описание которой:

Этот репозиторий содержит Go инструмент командной строки, который преобразует описания JSON и YAML OpenAPI в эквивалентные представления буфера протокола и из них.

На первый взгляд это, похоже, решает мою проблему, но, как оказалось, это библиотека только взаимопревращает двоичные файлы протокольного буфера (protobuf) (.pb) и swagger OpenAPI2 / OpenAPI3 (.json/.yaml), что подводит меня к моей новой проблеме.

Так, например, для следующего .pb file:


�3.0.1�…�
�Example service��Example service description*�
�Example contact2=

Apache 2.0�/http://www.apache.org/licenses/LICENSE-2.0.html:�1.0�!
�//localhost:9999/example/api/v1"â�
�
�/exampleResource��"���Example API��Example API description*�example-operation2B
@
example-query��query��example-query description �R�
    Ê��stringBÇ��œ�
�200�”�
‘�
�OK�Š�
C
�application/json�/
-�+
)#/components/schemas/common.StatusMessage
C
�application/yaml�/
-�+
)#/components/schemas/common.StatusMessage�¥�
�400���
š�
�Bad Request�Š�
C
�application/json�/
-�+
)#/components/schemas/common.StatusMessage
C
�application/yaml�/
-�+
)#/components/schemas/common.StatusMessage*Y
W
U
�common.StatusMessage�=
;Ê��objectú�/
�
�message��
    ��string
�
�status��
    ��string

генерирует следующий файл чванства:

openapi: 3.0.1
info:
  title: Example service
  description: Example service description
  contact:
    name: Example contact
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: "1.0"
servers:
- url: //localhost:9999/example/api/v1
paths:
  /exampleResource:
    get:
      summary: Example API
      description: Example API description
      operationId: example-operation
      parameters:
      - name: example-query
        in: query
        description: example-query description
        required: true
        schema:
          type: string
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/common.StatusMessage'
            application/yaml:
              schema:
                $ref: '#/components/schemas/common.StatusMessage'
        400:
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/common.StatusMessage'
            application/yaml:
              schema:
                $ref: '#/components/schemas/common.StatusMessage'
components:
  schemas:
    common.StatusMessage:
      type: object
      properties:
        message:
          type: string
        status:
          type: string

Возможно, .pb не отображается должным образом, доступ к нему здесь . Так что-то вроде:

�status��
    ��string

выглядит так:

<0x06>status<0x12><0x0b>
    Ê<0x01><0x06>string

Для приведенного выше примера я сначала написал swagger spe c, а затем сгенерировал .pb но то же самое можно сделать и наоборот.

Текущее состояние:

Если У меня есть способ конвертировать между (.pb) и ( .proto) файлов, преобразование l oop будет закрыто и завершено (.proto -> .pb -> .json/.yaml -> .pb -> .proto).

I Я уверен, что должен быть способ достичь этого, и, следовательно, существует решение моей первоначальной проблемы. Но я не смог найти ни одну статью или кусок кода, который это делает. Существуют ли разумные способы взаимного преобразования файлов .pb и .proto?

Если у вас совершенно иное решение, чем в моем исходном сценарии использования, пожалуйста, не стесняйтесь поделиться этим. Это очень помогло бы.

Заранее спасибо!

Правки:

(1) Благодаря последним комментариям становится ясно, что "преобразование" между .pb и .proto - это в первую очередь абсурдная просьба. Но исходная проблема остается той же, то есть как генерировать swagger3 (OpenAPI3) spe c из файла protobuf (.proto), используя аннотации, теги или иным образом. Соответственно изменяя заголовок вопроса.

(2) Буквально на следующий день после публикации я наткнулся на gnosti c -grp c хранилище, описание которого гласит:

Этот инструмент преобразует описание API OpenAPI v3.0 в описание службы gRP C, которую можно использовать для реализации этого API с помощью gRP C - JSON Транскодирование.

Опять же, это заставило меня выйти слишком рано. На самом деле, это был проект GSO C, и, как ни удивительна идея этого репозитория, он не соответствует требованиям . Более того, это не библиотека взаимопревращений, а очень незрелая для любого производственного использования. Фактически, он не может предоставить некоторые из базовых c фундаментальных возможностей OpenAPI3 spe c.

Но этот репозиторий движется в правильном направлении. Мой вывод заключается в том, чтобы иметь собственный плагин, который делает это, в основном, за счет расширения библиотеки аннотаций в GO.

(3) По-видимому, нет хороших и очевидных кандидатов для преобразования из .proto в OpenAPI3 spe c (.yaml/.json), за исключением gnosti c -grp c, который является очень незрелым и очень незавершенным для любого вида реального использования.

Но для обратного преобразование, т.е. OpenAPI3 spe c (.yaml/.json) в .proto, есть хорошая библиотека под названием openapi-generator под OpenAPITools, которая преобразует OpenAPI v2 / 3 spe c в клиент / сервер заглушки практически для всех платформ. Но поскольку это не первоначальный вопрос, вопрос все еще остается открытым.

1 Ответ

0 голосов
/ 29 апреля 2020

Несмотря на то, что вам требуется получить спецификацию YAML (OpenAPNv3) от PROTO, вы можете проверить этот плагин - gnosti c -grp c - для gnosti c, который выполняет обратное, то есть конвертирует из протоколов YAML / JSON spe c в протокол вместе с вызовами службы gRP C.

...