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

Posted

技术标签:

【中文标题】从 GRPC c++ 服务器实现返回“未找到”响应的正确方法是啥?【英文标题】:What's the correct way to return a 'not found' response from a GRPC c++ server implementation?从 GRPC c++ 服务器实现返回“未找到”响应的正确方法是什么? 【发布时间】:2019-11-28 18:52:17 【问题描述】:

我正在浏览指南和文档,但对惯用的 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;
  
;

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

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

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

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

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

【问题讨论】:

Status 的值不仅仅是Status::OK,最接近404 的可能是Status::NOT_FOUND 我认为这就是文档所反映的,但是当我尝试这样做时,我得到一个编译错误:No member named 'NOT_FOUND' in 'grpc::Status'; did you mean 'grpc::NOT_FOUND'? 如果我不返回 grpc::NOT_FOUND,该方法不喜欢它,因为它是不兼容的类型。 【参考方案1】:

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

return grpc::Status(grpc::StatusCode::NOT_FOUND, "error details here");

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

【讨论】:

以上是关于从 GRPC c++ 服务器实现返回“未找到”响应的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Grapevine 示例 REST 服务器代码返回“未找到”响应

grpc的简单用例 (golang实现)

未找到功能性渠道服务提供者。尝试添加对 grpc-okhttp、grpc-netty 或 grpc-netty-shaded 工件的依赖项

从 Nestjs 中的 observable grpc 服务获取数据,

gRPC C++从入门到无敌教程什么是gRPC

grpc 完成异步 java 服务请求/响应映射