所以我在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
。
1条答案
按热度按时间r1zhe5dt1#
有效载荷应修改为:
字符串
(
"update_mask": "meeting_meta"
替换为"update_mask": "meetingMeta"
)根据JSON字段掩码编码,每个路径中的字段名称转换为lower-camel命名约定。
下面从google.golang.org/protobuf/encoding/protojson包复制的源代码显示了如何验证字段名称(参见第20行,不允许字段名称中的
_
):回答第二个问题。
如果仔细查看错误消息,您将看到类似以下内容:
型
您会看到报告的无效路径是
" meetingMeta"
。注意前面的空格。这意味着软件包不会为您修剪路径。所以你不应该在路径之间添加空格。有效载荷应为:型