从 GRPC C++ 服务器实现返回“未找到”响应的正确方法是什么?

hec*_*ckj 2 c++ grpc

我正在浏览指南和文档,但对惯用的 C++ 编程并不十分熟悉。在我见过的所有服务器实现案例中,响应grpc::Status::OK都是在 RPC 实现结束时返回的,例如:

(来自https://github.com/grpc/grpc/blob/master/examples/cpp/helloworld/greeter_server.cc

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());
    return Status::OK;
  }
};
Run Code Online (Sandbox Code Playgroud)

是否总是返回Status::OK 的预期实现模式?您是否应该在失败条件下返回其他选项(例如对未找到请求的资源的 404 响应)?

还是希望您将相关错误条件编码到您自己的 proto 消息中,并始终回复一条可能包含错误详细信息的消息?

我认为文档反映了可以返回其他状态代码(例如,NOT_FOUND),但是当我尝试时出现编译错误:

No member named 'NOT_FOUND' in 'grpc::Status'; did you mean 'grpc::NOT_FOUND'?

如果我不返回grpc::NOT_FOUND,该方法不喜欢它,因为它是一种不兼容的类型。

hec*_*ckj 5

您可以通过使用代码和消息创建 Status() 来返回显式生成的状态,例如:

return grpc::Status(grpc::StatusCode::NOT_FOUND, "error details here");
Run Code Online (Sandbox Code Playgroud)

并返回它而不是Status::OK发送错误消息;