1
0
mirror of https://github.com/go-kratos/kratos.git synced 2026-05-22 10:15:24 +02:00

fix: query params: parse list failed, unsupported message type: "google.protobuf.Struct" #1967 (#1989)

* feat: Support google.protobuf.Struct in query parameters.

* style: add a blank line in test proto file.
This commit is contained in:
qi
2022-05-17 22:58:28 +08:00
committed by GitHub
parent ed144f6813
commit c8c870b77f
4 changed files with 143 additions and 26 deletions
+22
View File
@@ -11,6 +11,7 @@ import (
"github.com/go-kratos/kratos/v2/encoding"
"github.com/go-kratos/kratos/v2/internal/testdata/complex"
ectest "github.com/go-kratos/kratos/v2/internal/testdata/encoding"
)
type LoginRequest struct {
@@ -156,3 +157,24 @@ func TestProtoEncodeDecode(t *testing.T) {
t.Errorf("expect %v, got %v", "5566", in2.Simples[1])
}
}
func TestDecodeStructPb(t *testing.T) {
req := new(ectest.StructPb)
query := `data={"name":"kratos"}&data_list={"name1": "kratos"}&data_list={"name2": "go-kratos"}`
if err := encoding.GetCodec(contentType).Unmarshal([]byte(query), req); err != nil {
t.Errorf("expect %v, got %v", nil, err)
}
if !reflect.DeepEqual("kratos", req.Data.GetFields()["name"].GetStringValue()) {
t.Errorf("except %v, got %v", "kratos", req.Data.GetFields()["name"].GetStringValue())
}
if len(req.DataList) != 2 {
t.Errorf("execpt %v, got %v", 2, len(req.DataList))
return
}
if !reflect.DeepEqual("kratos", req.DataList[0].GetFields()["name1"].GetStringValue()) {
t.Errorf("except %v, got %v", "kratos", req.Data.GetFields()["name1"].GetStringValue())
}
if !reflect.DeepEqual("go-kratos", req.DataList[1].GetFields()["name2"].GetStringValue()) {
t.Errorf("except %v, got %v", "go-kratos", req.Data.GetFields()["name2"].GetStringValue())
}
}
+7
View File
@@ -9,6 +9,7 @@ import (
"strings"
"time"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/genproto/protobuf/field_mask"
@@ -297,6 +298,12 @@ func parseMessage(md protoreflect.MessageDescriptor, value string) (protoreflect
return protoreflect.Value{}, err
}
msg = fm
case "google.protobuf.Struct":
var v structpb.Struct
if err := protojson.Unmarshal([]byte(value), &v); err != nil {
return protoreflect.Value{}, err
}
msg = &v
default:
return protoreflect.Value{}, fmt.Errorf("unsupported message type: %q", string(md.FullName()))
}