使用重载端点构建 proto3 gRPC API

Build proto3 gRPC API with overloaded endpoints

我对 API 建筑相当陌生,所以这个问题可能比我最初提出的问题更广泛。 我正在 Golang 中创建一个 API(使用 protobuf 3 和 gRPC),它有两个相似的端点:

问题是,当我 运行 curl localhost:8080/project/genres 时,模式匹配导致 /project/{id} 端点以 genres 作为 ID 被调用。有没有一些简单的方法解决这个问题,还是我必须在服务器代码中构建一些东西才能根据类型调用正确的函数?

我还尝试翻转这些定义的顺序,以防模式匹配有一些我不知道的操作顺序,但这没有什么不同。

这是我的原型文件中的定义:

message EmptyRequest { }
message ProjectRequest {
  string id = 1;
}

message GenreResponse {
  int32 id = 1;
  string name = 2;
}

message ProjectResponse {
  int32 id = 1;
  string name = 2;
}

service ProjectService {
  rpc GetProject(ProjectRequest) returns (ProjectResponse) {
    option (google.api.http) = {
      get: "/v1/project/{id}"
    };
  }
  rpc GetGenres(EmptyRequest) returns (GenreResponse) {
    option (google.api.http) = {
      get: "/v1/project/genres"
    };
  }
}

我能够在 url 路径模板中指定一个检查来解决这个问题:

 rpc GetGenres(EmptyRequest) returns (GenreResponse) {
    option (google.api.http) = {
    get: "/v1/project/{id=genres}"
  };
}

这似乎解决了问题。我不知道是否还有其他解决方案,或者这是否是执行此操作的正确方法,但如果有更好的解决方案,我很乐意接受其他答案。