Protobuf / gRPC网关:带有HTTP选项的相对路径相互覆盖

时间:2018-08-13 21:43:31

标签: google-api swagger protocol-buffers grpc grpc-gateway

我目前正在使用gRPC和协议缓冲区来托管服务。我正在通过gRPC网关添加HTTP功能,但是遇到了问题。对于几个RPC,我想将原始请求中的字段映射到URI中。这样做似乎有两种语法形式:

using the name of the field in curly braces

option (google.api.http) = { get: "/v1/shelves/{shelf}" };

using a wildcard in the path, assigned to the name of the field

option (google.api.http) = { get: "/v1/{name=shelves/*}/books" }

第二种形式似乎是Google官方推荐的样式/语法,因为第二种链接来自其API设计指南。但是,他们的指南似乎并未就此语法的工作方式进行过多讨论。

语法的第二种形式吸引了我。我不记得在哪里,但我读到可以在同一字段中使用相对路径来指定嵌套资源。无论如何,我似乎都无法获得一个基本示例(只有一个URI参数)。当我使用grpc-gateway的protoc-gen-swagger插件从我的swagger.json文件创建一个proto文件时:

rpc DeleteAuthor(DeleteAuthorRequest) returns (google.protobuf.Empty) {
  option (google.api.http) = { delete: "/api/sample/v1alpha2/{name=authors/*}" };
}

rpc DeleteBook(DeleteBookRequest) returns (google.protobuf.Empty) {
  option (google.api.http) = { delete: "/api/sample/v1alpha2/{name=books/*}" };
}

都映射到同一路径,导致第一个RPC被swagger.json文件覆盖:

...
"paths": {
  "/api/sample/v1alpha2/{name}": {
    "delete": {
      "operationId": "DeleteBook",
      ...
    }
  }
}
...

要清楚,整个DeleteAuthor RPC无法在swagger.json文件中显示。

我想知道这是插件的问题还是对语法有误解。是否在任何地方记录了此语法?另外,一种语法比另一种语法有偏好或优势吗?

0 个答案:

没有答案