[Unity]利用Postman搭建方便的协议调试工具

为了解耦服务器与客户端的开发流程,决定在游戏内搭建一个httpserver用于模块协议的发送与接收
功能

  • 获取pb结构,转成json格式输出
  • 模拟客户端发送消息给服务器
  • 模拟服务器发送消息给客户端
  • 监听服务器发送给客户端的消息,并以json的方式输出解析后的结果

实现

  • 利用C#的反射特性,根据proto协议名得到pb消息类型
  • 利用json数据反序列化得到proto对象
  • 通过游戏内网络模块的Send接口来模拟发送消息给服务器
  • 通过游戏内网络模块的Push事件来模拟服务器发送消息给客户端
  • 在debug模式下支持注册监听的协议id,在收到服务器请求时,将pb消息序列化成json输出到Console

使用

  • Json示例:
{
    "protoName": "MoonClient.RpcC2G_RoleRevive",
    "protoData": {
        "type": 1,
        "roleId": 1565928
    }
}
  • 流程图


    数据流转流程图.png
  • Get请求:

Request URL: http://127.0.0.1:8008/
HttpMethod: Get
Headers: 
KEY       VALUE
protoName RpcC2G_RoleRevive

参数填好后点击“Send”,HttpServer响应后会在下⾯Body中输出protoName的json结构(注意需要选择json格式显示)
如下图所示:


Get请求1.png

Get请求2.png
  • Post请求:
Request URL: http://127.0.0.1:8008/
HttpMethod: Post 
Body: 选择raw => JSON(application/jsoon)

拷⻉Get请求中返回的json数据到body后,再次修改相关参数的数值,点击“发送”便可。
模拟消息发送成功后会在下⾯打印相关描述,如下图所示:


Post请求.png

关键代码

  • pb转json
        private static string getJsonFromPB(string pbType)
        {
            Type t = Type.GetType(pbType);
            if (t == null)
            {
                MDebug.singleton.AddErrorLogF("找不到对应类型定义:{0}", pbType);
                return string.Empty;
            }

            IMessage msg = Activator.CreateInstance(t) as IMessage;
            var fields = msg.Descriptor.Fields.InFieldNumberOrder();
            StringBuilder jsonStr = new StringBuilder("{");
            string value;
            for (int i = 0; i < fields.Count; i++)
            {
                var field = fields[i];
                switch (field.FieldType)
                {
                    case Google.Protobuf.Reflection.FieldType.Bool:
                        value = "true";
                        break;
                    case Google.Protobuf.Reflection.FieldType.Bytes:
                    case Google.Protobuf.Reflection.FieldType.String:
                        value = "\"\"";
                        break;
                    case Google.Protobuf.Reflection.FieldType.Group:
                        value = "\"unsupported type:Group\"";
                        break;
                    case Google.Protobuf.Reflection.FieldType.Message:
                        value = getJsonFromPB(field.MessageType.FullName);
                        break;
                    default:
                        value = "0";
                        break;
                }

                if (i > 0)
                {
                    jsonStr.Append(",");
                }
                jsonStr.Append("\"").Append(field.JsonName).Append("\":");
                if (field.IsRepeated)
                {
                    jsonStr.Append("[");
                }
                jsonStr.Append(value);
                if (field.IsRepeated)
                {
                    jsonStr.Append("]");
                }
            }

            return jsonStr.Append("}").ToString();
        }
  • json转pb
        Type pbType = Type.GetType(pbTypeStr);
        IMessage pbObj = Activator.CreateInstance(pbType) as IMessage;
        pbObj = pbObj.Descriptor.Parser.ParseJson(httpResult["protoData"].ToJson());

你可能感兴趣的:([Unity]利用Postman搭建方便的协议调试工具)