sogou / srpc

RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols.
Apache License 2.0
1.93k stars 382 forks source link

SRPC Http客户端与服务端参数不一致问题 #397

Open rayinengineer opened 1 month ago

rayinengineer commented 1 month ago

假设客户端SRPCHttpClient的proto中定义了message、name两个字段,服务端的proto中只定义了name字段,此时客户端调用的时候,服务端会报RPCStatusReqDeserializeError;在我们的场景中,客户端多给一些参数期望是允许的,服务端这些参数可以不管;我看了下源码,在int SRPCMessage::deserialize(ProtobufIDLMessage *pb_msg)方法中原先的代码 if (JsonToBinaryStream(resolver, GetTypeUrl(pb_msg), &input_stream, &output_stream).ok()) { ret = pb_msg->ParseFromString(binary_output) ? 0 : -1; }

修改 util::JsonParseOptions options; options.ignore_unknown_fields = true;

if (JsonToBinaryStream(resolver, GetTypeUrl(pb_msg), &input_stream, &output_stream,options).ok()) { ret = pb_msg->ParseFromString(binary_output) ? 0 : -1; }

后续是否可以做成可配置,让调用方自己决定是否需要忽略未知的json字段;

Barenboim commented 1 month ago

你好,你直接用SRPCServer和SRPCClient的话,是什么结果呢?理论上应该和Http的一样吧?

holmes1412 commented 1 month ago

你好,这个建议非常有用!而且你定位很细致~

srpc现在可以设置util::JsonOptions,它在serialize()期间指导如何将protobuffer转化成json。 设置的入口在文档里有:docs-07-srpc-http.md SRPCMessage具体设置的地方是: https://github.com/sogou/srpc/blob/abeac13f4a30a8b2c1220318f0671f6bc6c45d27/src/message/rpc_message_srpc.cc#L466

而你提到的util::JsonParseOptions,它在deserialize()期间指导如何将json转化成protobuffer,因此和上述功能是对称的,也是原先一直缺少的一环。

如果你感兴趣,可以仿照上面的入口,帮我们把这部分代码加上。或者我明天把这个加上也可以~