Python+fiddler模拟Protobuf数据容错

2020-12-24 10:55:04 浏览数 (1)

前言

在客户端和服务端数据传输交换中经常使用的技术是 JSON 或 XML,而小编最近在项目中接触到了一种新的数据传输框架——Protobuf,接下来我们就正式学习一下吧。

一、Protobuf介绍

简介

(1)Protocol Buffers(简称Protobuf) ,是Google出品的序列化框架,与开发语言、平台无关,具有良好的可扩展性;

(2)Protobuf和所有的序列化框架一样,都可以用于数据存储、通讯协议,是一种自动化机制的结构数据序列化方法。

优点

(1)更小——序列化后,数据大小可缩小约3倍;

(2)更高效——序列化速度更快,比XML和JSON快20-100倍,体积缩小后,传输时,带宽也会优化;

(3)更灵活——protoc编译器,自动进行序列化和反序列化;

(4)加密性好——HTTP传输内容抓包只能看到字节。

适应场景

在传输数据量大、网络环境不稳定的数据存储和RPC数据交换场景比较合适。

fiddler构造Protobuf数据响应

在测试中,经常需要做响应数据的容错,对于json格式的响应数据,大家都知道怎么做。但是对于Protobuf数据响应如何做数据容错呢?这时候我们可以通过python脚本来模拟数据响应。

下载fiddler插件

链接:https://pan.baidu.com/s/1MUVrBny4PgPmCDl4BPCHPg

提取码:9ags

工具下文件介绍

  • Inspectors

fiddler插件dll,关闭fiddler,将里面的dll文件放到fiddler安装目录下Inspectors文件夹下;

  • protobuf-net

Protobuf的C#依赖库和proto文件转换工具,将protobuf-net文件夹放到C:Progarm Files(X86) 目录下;

使用方法

上述步骤完成后,我们打开fiddler,就可以看到在Inspectors下出现Protobuf字段了,接下来我们就可以触发并查看数据流为Protobuf请求了,不会再是一堆二进制格式数据了;

fiddler构造Protobuf数据响应

在测试中,经常需要做响应数据的容错,对于json格式的响应数据,大家都知道怎么做。但是对于Protobuf数据响应如何做数据容错呢?这时候我们可以通过python脚本来模拟数据响应。

下载安装Python Protobuf

1、下载环境包https://github.com/protocolbuffers/protobuf/releases

2、下载好以后,解压缩,把protoc-3.14.0-win64文件夹下的protoc.exe复制到protobuf-python-3.14.0/src目录下;

3、进入protobuf-3.14.0/python目录下;

4、打开cmd,输入以下命令,编译并安装protobuf-python;

代码语言:javascript复制
python setup.py build
python setup.py test
python setup.py install

5、查看protobuf-python是否安装成功

代码语言:javascript复制
protoc --version

实现脚本

1、将需要修改的proto文件(服务端响应的protobuf格式数据)转换为python文件放到fiddler插件目录下,作为数据源;

(1)将proto文件放到C:Program Files (x86)protobuf-netprotobuf-net-VS9下,打开cmd;

(2)将当前文件夹下的proto文件编译为py文件,并且输出路径为当前文件夹;

代码语言:javascript复制
protoc.exe ./XX.proto --python_out =./  
注:./表示当前文件夹,--python_out表示编译为py文件

(3)将编译成功的XX.py文件放入python第三方库目录下,即XX/Lib/site-packages;

代码语言:javascript复制
import quick_share_pb2 as qs     #引用proto数据
from google.protobuf.json_format import MessageToJson   #引入protobuf框架

(4)python脚本中引入编译成功的proto数据;

2、获取作为响应body的数据源,修改想要做容错的数据;

代码语言:javascript复制
def __init__(self):
    self.body = qs.ServerResponseBody()   #获取服务端响应数据,即之前转化成功的proto数据
    # update_infos=self.body.update_infos['whitenewlist']
    container_properties = self.body.container_properties
    self.body.request_class = 'soul'
    container_properties['activeVpaDisappearTime'] = "30000"
    container_properties['activeVpaUnfoldDisappearTime'] = "35000"
    container_properties['isActiveVpa'] = "1"
    container_properties['flags'] = "rrc:soul,type:soul,cv:10.12.1000"
    container_properties['total_vpaminicards'] = "1"
    container_properties['total'] = "0"

3、基于python中http.server 组件库,搭建服务器;

代码语言:javascript复制
from http.server import BaseHTTPRequestHandler, HTTPServer
HOST = "10.129.XXX.44"  #自己的IP
PORT = 89              #任意端口号  
Handler = QuickShareHandler
httpd = HTTPServer((HOST, PORT), Handler)
httpd.serve_forever()

4、在fiddler中配置搭建的服务器IP:host;

5、打开fiddler,运行脚本,再返回的数据就是修改之后的内容了。

总结

以上是小编最近在项目中学习到Protobuf相关内容,还需要持续学习并挖掘,也欢迎大家来交流~

参考链接:http://venus.sogou-inc.com/AppStore/Wiki/Pages/WikiArticles.html?id=16768

0 人点赞