8

我目前正在创建一个 gRPC 服务,该服务使用 gRPC 网关/HTTP 反向代理来提供 HTTP 支持。我想遵循 Google API 设计的通用约定。

我在 Google API 设计指南中找到的示例google.protobuf.Empty使用消息来响应删除方法/RPC。这很好,但是当我使用来自grpc-gateway的 protoc -gen-swagger 从文件生成.swagger.json文件时,消息的描述被拉入作为响应对象的描述。这对我的 API 的用户来说是无关紧要的,并且可能会让人感到困惑,因为使用 HTTP 网关的人没有使用 protobufs。.protogoogle.protobuf.Empty

...
"paths": {
  "/v1/{name}": {
    "delete": {
      "summary": "Deletes a book.",
      "operationId": "DeleteBook",
      "responses": {
        "200": {
          "description": "",
          "schema": {
            "$ref": "#/definitions/protobufEmpty"
          }
        }
      },
      ...
    }
  }
},
"definitions": {
  "protobufEmpty": {
    "type": "object",
    "description": "service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
    "title": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:"
  }
}

我想说这是一个应该由 protoc-gen-swagger 插件解决的问题,除了它确实在做它应该做的事情。是否有 HTTP 注释以某种方式处理或覆盖响应中的字段?如果不是,人们如何处理这个问题?

4

1 回答 1

1

您可以编写一个脚本,在 OpenAPI 规范生成后删除不需要的元素protoc。类似的东西jq 'del(.definitions.protobufEmpty)' your.swagger.spec.json应该可以工作。

于 2020-01-28T12:41:26.830 回答