我目前正在使用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
文件中显示。
我想知道这是插件的问题还是对语法有误解。是否在任何地方记录了此语法?另外,一种语法比另一种语法有偏好或优势吗?