protobuf FieldMask unmarshalling in Go

mklgxw1f  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(100)

所以我在Go中使用kratos框架,我的API定义是:

rpc UpdateMeeting (UpdateMeetingRequest) returns (UpdateMeetingReply) {
    option (google.api.http) = {
      patch: "/v1/meetings/{meeting_id}"
      body: "*"
    };
  };

字符串
和相应的kratos生成的func

func _Meeting_UpdateMeeting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
    in := new(UpdateMeetingRequest)
    if err := dec(in); err != nil {
        return nil, err
    }
    if interceptor == nil {
        return srv.(MeetingServer).UpdateMeeting(ctx, in)
    }
    info := &grpc.UnaryServerInfo{
        Server:     srv,
        FullMethod: Meeting_UpdateMeeting_FullMethodName,
    }
    handler := func(ctx context.Context, req interface{}) (interface{}, error) {
        return srv.(MeetingServer).UpdateMeeting(ctx, req.(*UpdateMeetingRequest))
    }
    return interceptor(ctx, in, info, handler)
}


现在,如果我有下面的消息请求,我没有任何问题解组,请求实际上落在我的UpdateMeeting方法上,从Kratos生成的方法调用。

message UpdateMeetingRequest {

  string  meeting_id = 1;

  string updated_by = 2;

  MeetingMeta meeting_meta = 3;
  // more fields left out
}

message MeetingMeta {
  string meeting_link = 1;
  // more fields left out
}


但是当我添加FieldMask时,我实际上需要检查哪个字段存在,哪个不存在,我得到这个错误-

message UpdateMeetingRequest {

  string  meeting_id = 1;

  string updated_by = 2;

  MeetingMeta meeting_meta = 3;

  google.protobuf.FieldMask update_mask = 4;
}

Error
{
    "code": 400,
    "reason": "CODEC",
    "message": "body unmarshal proto: (line 5:18): google.protobuf.FieldMask.paths contains invalid path: \"meeting_meta\"",
    "metadata": {}
}


有效载荷

{
  "meeting_meta": {
      "meeting_link": "ac"
  },
  "update_mask": "meeting_meta"
}


对于尝试的更新掩码:meeting_Meta.meeting_link、meeting_meta、meeting_link这三个错误相同或相似。
编辑:所以,通过答案中提到的方法,我可以通过更改update_mask来使其工作。meeting_Meta -> meetingMeta.
但是遇到相同的问题,即,如果有效载荷中有两个名称为'_'的字段,则“包含无效路径”。范例:

{
  
  "updated_by": "dsjhvg",
  "meeting_meta": {
      "meeting_link": "ac"
  },
  "update_mask": "updatedBy, meetingMeta"
}


单独地,这两个字段都被整理得很好。结合起来,我在update_mask中的第二个路径中遇到了错误。对于这个有效载荷,它是meeting_meta,如果我重新排列它们,那么它是updated_by

r1zhe5dt

r1zhe5dt1#

有效载荷应修改为:

{
  "meeting_meta": {
      "meeting_link": "ac"
  },
  "update_mask": "meetingMeta"
}

字符串
"update_mask": "meeting_meta"替换为"update_mask": "meetingMeta"
根据JSON字段掩码编码,每个路径中的字段名称转换为lower-camel命名约定。
下面从google.golang.org/protobuf/encoding/protojson包复制的源代码显示了如何验证字段名称(参见第20行,不允许字段名称中的_):
回答第二个问题。
如果仔细查看错误消息,您将看到类似以下内容:

google.protobuf.FieldMask.paths contains invalid path: " meetingMeta"


您会看到报告的无效路径是" meetingMeta"。注意前面的空格。这意味着软件包不会为您修剪路径。所以你不应该在路径之间添加空格。有效载荷应为:

{
  
  "updated_by": "dsjhvg",
  "meeting_meta": {
      "meeting_link": "ac"
  },
  "update_mask": "updatedBy,meetingMeta"
}

相关问题