grpc-gateway端点的优先级顺序

时间:2018-08-15 19:39:07

标签: routes grpc grpc-gateway

我有这样定义的服务:

service Service {
    rpc SearchCategory(SearchCategoryRequest) returns (SearchCategoryResponse) {
        option (google.api.http) = {
            get: "/v1/categories/search"
        };
    }
    rpc GetCategory(GetCategoryRequest) returns (GetCategoryResponse) {
        option (google.api.http) = {
            get: "/v1/categories/{id.val}"
        };
    }
}

问题在于,即使我调用search?q=MyQuery,它也会被GetCategory方法捕获,并尝试获取ID为search的类别。

我想是因为路径很近。有没有一种方法可以像在经典Web应用程序中那样在路由中定义优先级?

谢谢

2 个答案:

答案 0 :(得分:0)

这个问题已经有一段时间了,但我最近自己遇到了完全相同的问题并找到了解决方案。

因此,基本上,您将端点放在 protobuf 服务定义中的较低,它的优先级较高

对于您的情况,您需要交换两个端点,以便 SearchCategory 位于 GetGategory 之下,从而赋予它更高的优先级。

service Service {
    rpc GetCategory(GetCategoryRequest) returns (GetCategoryResponse) {
        option (google.api.http) = {
            get: "/v1/categories/{id.val}"
        };
    }
    rpc SearchCategory(SearchCategoryRequest) returns (SearchCategoryResponse) {
        option (google.api.http) = {
            get: "/v1/categories/search"
        };
    }
}

那么 /v1/categories/search 应该可以工作。

答案 1 :(得分:-1)

不使用{id.val},请使用{id}。并且会工作

message GetCategory {
    string id = 1;
}