所以我将kratos框架与Go结合使用,我的API定义是:
rpc UpdateMeeting (UpdateMeetingRequest) returns (UpdateMeetingReply) {
option (google.api.http) = {
patch: "/v1/meetings/{meeting_id}"
body: "*"
};
};
和相应的KRATOS生成的函数
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)
}
现在,如果我将以下内容作为消息请求,则解组没有任何问题,并且请求实际上落在从Kratos生成的方法调用的UpdateMeeting方法上.
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"
}
对于try 的更新掩码:MeetingMeta.Meetinglink、MeetingMeta、Meetinglink这三个都有相同或类似的错误.
编辑: 因此,使用答案中提到的方法,我能够通过更改UPDATE_MASK来使其工作.MeetingMeta->;MeetingMeta.
但也会遇到同样的问题,即如果有效负载中有两个字段的名称中有‘_’,则会出现"包含无效路径"的情况.示例:
{
"updated_by": "dsjhvg",
"meeting_meta": {
"meeting_link": "ac"
},
"update_mask": "updatedBy, meetingMeta"
}
单独来看,这两个字段都被很好地解组了.总而言之,我在UPDATE_MASK中的第二个路径上遇到了错误.对于这个有效载荷,它是meeting_meta
,如果我重新排列它们,那么它是updated_by
.