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

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


该Status类型定义了适用于不同编程环境的逻辑错误模型,包括 REST API 和 RPC API。


但是我遇到details了结构部分的问题。我知道它是 type []*anypb.Any,但是,我不清楚如何将它变成“解包”形式,因此我可以看到 Field 和 Description 属性,而不是 base64 编码的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,

    "message": "One or more fields are invalid",

    "details": [

        {

            "type_url": "type.googleapis.com/google.rpc.BadRequest.FieldViolation",

            "field": "Email",

            "description": "Invalid email format"

        },

        {

            "type_url": "type.googleapis.com/google.rpc.BadRequest.FieldViolation",

            "field": "Password",

            "description": "Must be at least 10 characters"

        }

    ]

}


海绵宝宝撒
浏览 128回答 1
1回答

慕莱坞森

编码器json不是 100% 兼容 protobuf。使用protojson.Marshalfrom"google.golang.org/protobuf/encoding/protojson"代替。看到这个游乐场。虽然它没有那么快。编辑要回答更快的替代方案的请求:可以使用包含所有必需数据的自定义错误结构并手动解开 grpc 状态及其详细信息。看到这个游乐场。在我的机器上,这节省了大约 15% 的时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go