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:
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user