问题描述
我想对我的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%的时间。