如何在golang中解压缩grpc status.details错误?

问题描述

我想对我的REST API使用google.golang.org/grpc/status错误模型,因为它说可以:

class | apples 1 | 10 3 | 7 类型定义了适用于不同编程环境(包括REST API和RPC API)的逻辑错误模型。

但是我在结构的Status部分遇到了问题。我了解它的类型为details,但是,我不清楚如何将其转换为“未打包”格式,因此可以看到Field和Description属性,而不是base64编码的[]*anypb.Any字段。>

我得到的是什么

value

我应该得到什么:

{
    "code": 3,"message": "One or more fields are invalid","details": [
        {
            "type_url": "type.googleapis.com/google.rpc.BadRequest.FieldViolation","value": "CgVFbWFpbBIUSW52YWxpZCBlbWFpbCBmb3JtYXQ="
        },{
            "type_url": "type.googleapis.com/google.rpc.BadRequest.FieldViolation","value": "CghQYXNzd29yZBIeTXVzdCBiZSBhdCBsZWFzdCAxMCBjaGFyYWN0ZXJz"
        }
    ]
}

示例代码

{
    "code": 3,"field": "Email","description": "Invalid email format"
        },"field": "Password","description": "Must be at least 10 characters"
        }
    ]
}

解决方法

json编码器与Protobuf并非100%兼容。

使用protojson.Marshal中的"google.golang.org/protobuf/encoding/protojson"

请参阅此Playground

虽然没有那么快。

EDIT回答请求以寻求更快的替代方法:

一个人可以利用一种自定义错误结构来保存所有必需的数据,并手动解开grpc状态及其详细信息。参见此playground。在我的机器上,这节省了大约15%的时间。