我的 Web 应用程序向可扩展服务代理(ESP)发出 HTTP 请求,而后者又委托给gRPC 服务器(用 Python 编写)。忽略 Android 和 iOS 客户端,架构是:
ESP 是一个nginx 反向代理。
gRPC 服务器(参考架构中的“您的代码”)可能会引发异常,在这种情况下,我使用context.abort引发异常并以非 OK 状态终止 RPC:
try:
# Do something that could fail.
except ValueError as e:
context.abort(grpc.StatusCode.DATA_LOSS, str(e))
虽然可以使用set_code和set_details,但它们仍然会导致 HTTP 状态为 200 OK。
有两个问题:
gRPC状态码由 ESP 容器(nginx 代理)转换为通用
500 Internal Server Error
的 .随附的详细信息已被删除。
和 2. 组合意味着 Web 客户端最多对 gRPC 服务器引发的所有异常具有
500 Internal Server Error
a 。
最终,我不明白如何将更多信息(理想情况下,自定义)错误返回给网络客户端。