gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:17:25 35 4
gpt4 key购买 nike

我想对我的REST API使用google.golang.org/grpc/status错误模型,因为它说您可以:Status类型定义一个逻辑错误模型,该模型适用于不同的编程环境,包括REST API和RPC API。
但是我在结构的details部分遇到了问题。我知道它的类型是[]*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"
}
]
}
示例代码:
package main

import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"

"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"google.golang.org/genproto/googleapis/rpc/errdetails"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)


func main () {

r := chi.NewRouter()
r.Use(middleware.Logger)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {

err := getError()
st, _ := status.FromError(err)

p:= st.Proto()

w.Header().Set("content-type","application/json")
err = json.NewEncoder(w).Encode(p)

if err !=nil {
fmt.Println("Error encoding", err)
}

})

http.ListenAndServe(":3000", r)
}


func getError() error {

st := status.New(codes.InvalidArgument, "One or more fields are invalid")

f1 := &errdetails.BadRequest_FieldViolation{
Field: "Email",
Description: "Invalid email format",
}

f2 := &errdetails.BadRequest_FieldViolation{
Field: "Password",
Description: "Must be at least 10 characters",
}

st, _ = st.WithDetails(f1)
st, _ = st.WithDetails(f2)

return st.Err()
}


最佳答案

json编码器与protobuf不100%兼容。
改用protojson.Marshal中的"google.golang.org/protobuf/encoding/protojson"
看到这个Playground
虽然没有那么快。
编辑要回答更快的替代方法的要求:
可以利用自定义错误结构保存所有必需的数据,并手动解开grpc状态及其详细信息。看到这个playground。在我的机器上,这节省了大约15%的时间。

关于go - 如何在golang中解压缩grpc status.details错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63755105/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com