Мой оригинальный вариант использования:
Я создаю приложение в 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 в клиент / сервер заглушки практически для всех платформ. Но поскольку это не первоначальный вопрос, вопрос все еще остается открытым.