首页 > 解决方案 > 如何使用 envoy-proxy 在 Grpc 中以 json 格式发送错误响应

问题描述

我正在使用 resonseObserver.onError() 从 grpc 服务抛出错误,但是在从 REST 客户端访问 REST API 时,我没有收到 json 格式的消息,尽管积极的情况工作正常并以 json 形式给出响应。

我正在使用特使作为转码器,任何人都可以帮助我如何获得错误响应也作为 json。目前,我在错误情况下收到 BadRequest。该项目在 SpringBoot 中。

TIA

标签: springspring-bootgrpcgrpc-javaenvoyproxy

解决方案


您可以使用convert_grpc_status : true 来执行此操作。

      http_filters:
      - name: envoy.filters.http.grpc_json_transcoder
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
          proto_descriptor: "/tmp/envoy/proto.pb"
          services: ["xxxxxxxx"]
          convert_grpc_status: true
          print_options:
            always_print_primitive_fields: true
            always_print_enums_as_ints: false
            preserve_proto_field_names: false

如果您的意思是这样的返回详细信息键:

{
  "code": 3,
  "message": "API call quota depleted",
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
      "resourceType": "xxxxxx",
      "resourceName": "",
      "owner": "",
      "description": ""
    }
  ]
}

你必须编译你的 .proto 文件:

import "google/rpc/error_details.proto";

因为 Envoy 无法在没有错误类型的情况下从后端服务器反序列化二进制详细信息。

您还可以阅读如何使用 Python 发送详细的错误响应:How to send error details like as BadRequest


推荐阅读