2

我的 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_codeset_details,但它们仍然会导致 HTTP 状态为 200 OK。

有两个问题:

  1. gRPC状态码由 ESP 容器(nginx 代理)转换为通用500 Internal Server Error的 .

  2. 随附的详细信息已被删除。

  3. 和 2. 组合意味着 Web 客户端最多对 gRPC 服务器引发的所有异常具有500 Internal Server Errora

最终,我不明白如何将更多信息(理想情况下,自定义)错误返回给网络客户端。

4

1 回答 1

3

grpc Status code::DATA_LOSS,被翻译成HTTP代码500。代码在这里

grpc 状态详细信息(状态代码和错误消息)以 JSON 格式在响应正文中发送回。代码在这里

于 2019-01-08T00:44:48.937 回答