【问题标题】:Confusion creating swagger.json file from proto file从 proto 文件创建 swagger.json 文件的困惑
【发布时间】:2017-07-11 03:05:35
【问题描述】:

我已经为我打算生成的 REST web 服务创建了一个包含所有必要消息和 rpc 函数的 proto 文件。使用 protoc-gen-swagger 插件,我设法将该 proto 文件编译成 swagger.json 文件,一切似乎都很好,除了两件事,我似乎无法解决。

  1. swagger.json 文件中的所有定义都以我的 proto 文件包的名称为前缀。有没有办法摆脱这种情况?

  2. 我的消息的所有字段都是“可选的”。它们没有明确指定,但没有指定为“必需”,根据定义,它们是可选的。 Proto3 不再支持必需/可选/重复,但即使我使用 Proto2 并添加这些关键字,它似乎也不会影响 swagger.json 输出。如何在我的 proto 文件中指定一个字段是必需的,以便 protoc-gen-swagger 将所需的部分添加到 json 输出?

这是一个非常基本的 proto 文件的示例:

webservice.proto

syntax = "proto3";
package mypackage;
import "google/api/annotations.proto";

service MyAPIWebService {
    rpc MyFunc (MyMessage) returns (MyResponse) {
        option (google.api.http) = {
            post: "/message"
            body: "*"
        };
    }
}

message MyMessage {
    string MyString = 1;
    int64 MyInt = 2;
}

message MyResponse {
    string MyString = 1;
}

然后使用以下命令将其编译成 swagger.json 文件:

协议-I。 -I"%G​​OPATH%/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis" --swagger_out=logtostderr=true:. webservice.proto

产生以下输出: webservice.swagger.json

{
  "swagger": "2.0",
  "info": {
    "title": "webservice.proto",
    "version": "version not set"
  },
  "schemes": [
    "http",
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/message": {
      "post": {
        "operationId": "MyFunc",
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/mypackageMyResponse"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/mypackageMyMessage"
            }
          }
        ],
        "tags": [
          "MyAPIWebService"
        ]
      }
    }
  },
  "definitions": {
    "mypackageMyMessage": {
      "type": "object",
      "properties": {
        "MyString": {
          "type": "string"
        },
        "MyInt": {
          "type": "string",
          "format": "int64"
        }
      }
    },
    "mypackageMyResponse": {
      "type": "object",
      "properties": {
        "MyString": {
          "type": "string"
        }
      }
    }
  }
}
  1. 注意 proto 文件中的 MyMessageMyResponse 如何转换为 json 文件中的 mypackageMyMessagemypackageMyResponse

  2. 如果我想要,例如,MyMessage:MyString 是必需的,我必须在“定义”中的“mypackageMyMessage”部分中添加一个部分,如下所示:

    “必需”:[ “我的字符串” ]

如果有一种方法可以在 proto 文件中指定,我肯定会更喜欢,这样我每次编译时都不必手动编辑 json 文件。

【问题讨论】:

  • 您找到解决方案了吗?我正在寻找做类似的事情。倾向于编写一个带有我自己的选项的插件,可以过滤掉“仅创建”或“内部”的字段。
  • 很遗憾没有。我最终放弃并接受了人工干预。

标签: go protocol-buffers swagger


【解决方案1】:

在这里发帖给遇到此问题并寻找相同信息的其他人。


更新 这是代码定义如何创建定义的地方。

https://github.com/grpc-ecosystem/grpc-gateway/blob/master/protoc-gen-swagger/genswagger/template.go#L859


这是您可以根据需要表示字段的方式——在您的消息定义中添加一个自定义选项:

message MyMessage {
    option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {
        json_schema: {
            title: "MyMessage"
            description: "Does something neat"
            required: ["MyString"]
        }
    };

    string MyString = 1;
    int64 MyInt = 2;
}

【讨论】:

【解决方案2】:

您的前缀 mypackage 是 .proto 文件中命名空间的一部分。它来自以下行:package mypackage; 删除此行并重新生成 json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多