据工作需要,中国银行数据中心部分职位面向社会公开招聘,现就有关事宜公告如下。
具体职位信息及任职资格要求详见阅读原文。
(一)遵纪守法、诚实守信,具有良好的个人品质和职业道德,无不良从业记录,愿意履行中国银行员工义务和岗位职责;
(二)全日制大学本科及以上学历,留学归国人员应取得教育部留学服务中心的学历学位认证;
(三)应聘工程师人员需具备4年及以上相关工作经验(全日制硕士研究生及以上学历且学制为两年以上的可减少1年年限),应聘助理工程师人员需具备2年及以上相关工作经验;
(四)年龄一般不超过35周岁;
(五)身心健康,工作抗压能力强;
(六)符合中国银行亲属回避的有关规定。
请登录 http://chrcmp.chinahr.com/views/boc/social2019/job.html#title 按照网站提示填写并投递简历。每位应聘者限报1个职位,如同意调剂其他职位可在申请的相应栏位注明。应聘者信息将被严格保密,所有资料恕不退还。应聘者对个人填报信息的真实性、完整性负责,如与事实不符,中国银行有权取消录用资格。
中国银行采取滚动招聘方式,将在报名截止日期前分批次开展简历筛选、笔试、面试、体检及背景调查等工作,择优确定人选。
报名截止时间:北京时间2020年4月30日24:00。
期待您的参与!
面的系列文章里提过, TAO 工具将模型训练的绝大部分技术难题都进行抽象化处理,大幅度减轻开发人员的负担,唯独数据集的收集与整理仍须由人工自行处理,这几乎是留个操作人员的最后工作了。
大部分关于数据集的问题就是标注格式的转换,包括 Pascal VOC、OpenImages、COCO 这些影响力较大的数据集,个别使用 .xml、.csv、.json 等不同的文件格式,包括标注栏位的内容与顺序也都不尽相同,这通常是困扰使用者的第一个门槛。
好在这些格式之间的转换,只需要一些简单的 Python 小工具就能完成,虽然繁琐但也没有什么技术难度。
在 https://docs.nvidia.com/tao/tao-toolkit/text/data_annotation_format.html 里,提供 TAO 工具针对不同应用类型所支持的格式,简单整理如下:
这里只将使用率较高的图像分类与物件检测两种应用的数据格式进行说明,其他应用的数据格式请自行参照前面提供的说明连接。
1. 图像分类的“目录结构”格式:
这是以“图像”为单位的分类应用,每张图片只会有一个分类属性,因此格式相对简单,只要将图片根据目录结构的规则进行分类就可以。
为了配合模型训练的工作,我们需要将数据集切割成 “train”、”val”、“test” 三大类,分别作为训练、校验与测试用途。
在每个数据集下面再延伸出“分类属性”子目录,例如做早期用于识别 0~9 手写数字的 MNIST 数据集,就得在 train/val/test 下面各添加 “0”~“9” 共10个子目录,合计是 2 层 33 个目录结构。
如果是使用 ILSVRC 竞赛的 1000 分类 ImageNet 数据的话,就得根据这 1000 个分类在三个目录下个创建 1000 个分类属性子目录,例如 dog、cat、person 等等,虽然很繁琐但也不复杂,对模型训练工具而言,图像文件名称是无所谓的。
数据来源通常是两大类,第一种是自行从网上收集与手动拍摄,第二种是从现成数据集进行提取,包括 ImageNet、Pascal VOC、COCO、OpenImages 这些知名的通用数据集,都有非常丰富的资源。
但现在的最大问题是,如何从这些数据集中提取所需要的图像,并根据“目录结构”存放成 TAO 所支持的格式?
这个部分需要使用者自行研究所需要的数据集的结构,撰写简单的提取工具。例如 TAO 提供的 classification 图像分类模型训练范例项目中,使用 Pascal VOC 2012 数据集来进行图像分类的模型训练,但是这个数据集使用下图左的路径分布方式,与TAO所支持的“目录结构”格式并不相同,那么该如何处理?
我们必须对这个数据集的相关资源有进一步了解。在 VOC 数据集的 ImageSets/Main 里存放 63 个 .txt 文件,刨去 train.txt、trainval.txt 与 val.txt 三个文件,其余 60 个分属于数据集的 20 个图像类别的三种用途,例如 xxx_trainval.txt、xxx_train.txt、xxx_val.txt,其中前者的内容是后面两个文件的合并。
在 classification.ipynb 脚本中提供两段数据格式转换的Python代码(请自行查阅),在 “A. Split the dataset into train/val/test” 的环节,执行以下处理:
(1) 将存放在上图左边 “JPEGImages” 里面的图像文件,借助 xxx_trainval.txt 分类列表的协助,复制到上图右方的 “formated” 下的20个分类子目录;
(2) 从 “formated” 的每一类图像数据,分别切割出 train/val/test 三大分类,放到 “split” 目录下,作为后面转换成 tfrecords 的数据源。
经过两次转换处理后,在这里的数据内容就该有 3 份相同图像数据,只不过使用不同的路径结构去存放而已。如果不想浪费存储空间的话,可以将 VOCdeckit 与 formatted 两个目录删除,只需要保留 split 目录的结构就足够。
至于其他数据的转换,也需要使用者对该数据集有充分的了解,毕竟学习数据转换的精力要远远低于自行收集的时间,绝对是划算的。
2、物件检测的 KITTI 格式:
绝大部分通用数据集为了提高普及度,都提供多种应用类别的标注 (annotations) 内容,其中 “物件位置 (location)” 是最基本的数据,其他还有与人体相关的骨骼结构标注、语义分割的材质标注、场景描述的标注等等,每种数据集都有其侧重点,因此内容种类与格式也都不尽相同,这是大伙要使用数据集的第一个门槛。
物件检测是比图像分类更进一步的深度学习应用,要在一张图像中找出符合条件的物件,数量没有限定,就看训练出来的模型具备哪些分类功能。
每个数据集的差异,就是将所包含的图像,都进行不同功能与不同细腻度的标注内容,这些动辄数万张到上千万张的图像、分类数量从20到数千的不同数据集,也都使用不同的文件格式去储存这些标注内容,有些是图像文件与标注文件一一对应,有些则是将上千万张的标注内容全部存在一个巨大的标注文件里。
例如 COCO 数据集将数百万张的标注存放在上百兆的 .json 文件里、 OpenImages 数据集上千万张的标注存放在 1.3GB 的 .csv 文件中,而 Pascal VOC 与 ImageNet 的标注文件则提供一对一对应的 .txt 与 .xml 格式,莫衷一是。
事实上对应物件检测的应用,我们只需要标注文件中最基本的元素,包括“类别”与“位置”这两组共 5 个栏位数据就可以。类别部分有的数据集直接使用“类别名”,有的数据集只提供“类别编号”,然后再到类别文件中寻找对应;位置信息部分,有些提供“左上角”与“右下角”坐标位置,有些使用“起点坐标”与“长宽”来表示,都是一组 4 个浮点值。
因此,要从庞大的数据集中,提取我们所需要的类别与位置标注,就必须对个别标注结构进行研究,才能得到我们想要的结果,这个步骤是跳不过去的。网上虽然有很多标注格式转换的功能,但是通用性受限制,还是需要进行局部修改。
现在来看看 TAO 工具在物件检测模型训练所支持KITTI格式内容,主要栏位如下:
其标注文件是.txt纯文字格式,在文件内的表达方式如下:
熟悉物件检测应用的人,可能会觉得这个 KITTI 标注格式中,有一半以上的栏位是用不上的,为何英伟达却十分偏好这个格式呢?
如果将视野放大到自动驾驶与 3D 应用领域的话,就能理解英伟达选择这个格式的理由,因为 KITTI 数据集是由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。
在物件检测应用中只需要用到“类名”与“边界框坐标”这两部分,如果从其他数据集提取数据时只要找出这 5 个数据,如果坐标格式为“起点坐标+长宽”的格式,也能简单转换成“起点坐标+重点坐标”形式,写入对应的 KITTI 标注文件中,其他栏位的内容 “补 0” 就可以,所以整个转换过程还不是太麻烦。
在 TAO 的视觉项目中的 face-mask-detection/data_utils 里,提供大约 4 转换成 KITTI 格式的工具,能提供大家作为参考。
只要能将不同数据集之间的格式转换弄通,就能非常高效的从庞大的数据集资源中,轻松获取我们所需要的类别数据,进一步训练出自己专属的模型,因此这个过程对使用深度学习的工程师是很重要的基本工作。
fiddler大致分为5 个区域,分别为菜单栏、工具栏、会话监控列表、辅助选项卡、状态栏
如图
主要的功能其实很简单主要又包含file(文件)、edit(编辑)、Rules(规则)、 Tools(工具) 、View(视图) Help(帮助)
file菜单主要包含新建视图、加载一个保存好的抓包会话文件、保存所有会话列表数据到一个.saz文件中等等.
edit菜单主要包含一些编辑的功能,例如对会话的:复制 粘贴 拷贝等操作
Rules规则菜单所谓规则 指的也就是抓包的规则, 按照设置的一系列规则来显示抓取的数据会话常见的勾选设置有:
Hide CONNECTs(把建立通道连接隐藏了)的规则
Hide 304s(也就是304相关的会话也隐藏了)的规则
Hide image Request (也就是隐藏和图片相关会话)的规则
其他Rules规则菜单中的规则选项大家可以自行尝试!
Tools(工具菜单) 这个菜单多数是针对fiddler这款工具本身的一些网络设置
View(视图菜单) 这个菜单是针对fiddler显示界面与视图的一些设置,如果有些工具栏和按钮没有显示,就可以在这里来查找!
Help(帮助菜单) 一些关于fiddler和网络的帮助信息文档,有兴趣的可以去查查看!
工具栏上的快捷按钮,也是平常我们在抓包过程当中经常会使用到的,这里我列举一些常会用到的工具按钮
使用这个工具按钮你可以给某个会话添加一些描述或者备注信息!
如图
这个按钮的作用其实就是,重新发出一次当前你所选择的会话请求, 也就是说你点击一下Replay就会通过Fiddler来帮你发一次请求到服务器去!
也可以通过选择一个会话之后点击键盘上的R键进行快速重放操作!
如图
如果你想一次性向某个会话发送n次请求, 那么可以先选择一个会话,然后按住shift+R 或者 按住shift+Replay按钮或者shift + u来输入一个请求的次数!
如图
这种操作可以对一些普通的基础服务器做一个压力测试, 也就相当于一个简单的并发测试
删除会话按钮顾名思义就是用来删除列表中的会话, 它这个按钮内部包含了删除会话的一些过滤方法
比如:
1.Remove All(删除全部会话) 快捷键为ctrl+x
2.images (删除图片相关的请求会话)
3.connect (删除连接相关的请求会话)
4.Non-200s (删除非200状态的请求会话)
5.Non-Browser(删除非浏览器的请求会话)
等等...
当然删除会话的方法还有很多,比如你在会话列表中选择了某几个会话想保留,其他会话全部删除
这种操作可以先按住ctrl然后选择要保留的会话,然后再按下shift+delete即可!
如图
当然也可以在会话列表中选择某一个会话然后右键选择Remove命令来进行删除
selected Session (删除选择的会话)
Unselected Session (删除未选择的会话)
All Session (删除全部会话)
如图
当然也可以直接点击键盘上的delete来进行删除会话!
当把这个按钮点击上了之后,会对所有返回的请求会话进行解码
要知道http有的时候返回的正文内容是被编码之后的,若要解码全部会话中的响应报文可以先把这个按钮点选上, 在抓包的时候响应报文就会自动解码其中的正文内容!
如图
当然你也可以不用点选这个按钮,要解码那个会话,再选择会话的时候点击右边响应报文中的Response body is encoded click to decode(解码响应报文) 就可以了!
如图
这个按钮的功能可以帮你规定会话列表中最多能够保留多少个会话, 根据需求自己选择就可以了!
如图
这个功能有点意思, 可以瞄准你想要抓取的对象
比如说: 我们现在要抓取一个ie浏览器的请求数据包, 那么可以以下操作
如图
看到Process(进程)了吧, 都是瞄准的ie浏览器来进行抓取的请求!
find按钮就是用来进行搜索和查找会话的, 我们可以根据一些条件快速定位到想要的会话请求
它对应的快捷键为ctrl+f
如图
一些其他选项的含义如下表:
选项 | 描述 |
Match case | 表示区分大小写 |
Regular Expression | 正则表达式 |
Search binaries | 搜索二进制文件 |
Decode compressed content | 解码压缩内容 |
Search only selected sessions | 只搜索选择的请求 |
Result Highlight | 搜索结果强调颜色 |
这个按钮会把当前所有的会话全部以一个.saz的一个归档文件进行保存!
这样也方便发给其他的开发和测试人员观看, 这没什么好说的!
这个按钮就是单纯的截图,截图的时候会产生一个倒计时, 然后把截好的图片通过本地发送请求到localhost, 也可以拷贝出来! 用处不是很大!
如图
这个按钮的作用就是可以快速的打开当前电脑里已安装的浏览器 没什么太大特别的!
这个按钮的作用就是清除缓存, 注意它是清除的ie浏览器的缓存
这个按钮的功能可以让文本进行编码与解码
如图
会话列表 主要是fiddler所抓取到的每一条http请求都会显示到这里!
每一条所抓取到的信息我们称之为一个session(会话),有编程基础的朋友肯定马上就能理解这个会话的含义
会话列表中又包含了很多栏位,而每一个栏位都有其自己的含义,用来描述当前每一条会话的详细信息!
各个栏位的含义描述如下表:
名称 | 描述 |
# | 显示抓取的请求id顺序和类型图标,id从1开始递增 |
Result | HTTP响应结果状态码 |
Protocol | 当前请求会话所使用的协议,如HTTP/HTTPS/FTP等等 |
Host | 请求地址的主机名或域名 |
URL | 从服务器请求资源的文件路径,有的时候也包含GET请求的具体参数 |
Body | 响应内容的大小, 单位为字节 也就是响应主体(Response Body)中的字节数 |
Caching | 请求的缓存过期时间或者是对缓存的的控制相关描述 通常为Cache-Control响应头中的值! |
Content-Type | 响应内容的类型,以及编码类型 |
Process | 发送此请求的程序与进程id:例如chrome:1604 |
Comments | 允许用户给请求会话添加备注文本信息 |
Custom | 允许用户设置使用脚本设置自定义字段 |
........................................ |
如图
首先在每一个栏位上面右键都会出现以下三个选项
如图
1.Search this column (搜索此栏)
意思是它会根据每一个栏位的特性来进行条件搜索此栏位, 这样可以快速帮助用户精准找到想要的数据信息!
如图
2.Flag duplicates (重复会话标志)
这个功能可以给我们的会话打上标志背景, 并且这个背景颜色标记的是当前列中存在重复的数据
举个例子吧: 例如我们在URL这一栏上右键选择Flag duplicates 那么就会在当前列中存在重复URL的数据上打上一个绿色的背景
如图
3.Hide this column (隐藏此列)
这个没什么说的 就是把当前这一列栏位给隐藏了!
4.Ensure all columns are visible(确保所有列都可见)
这个功能就相当于一个复位按钮,如果你隐藏了某个栏位又不知道如何把它显示出来,那么就直接点选它就可以全部栏位都复位!
5.Costomize columns(自定义栏位)
自定义栏位,是对所有列进行自定义, 其实也相当于新增一个栏位,而不是选择的栏位
举个例子 我们来给Fiddler添加一个IP显示栏位
fiddler默认是不显示ip栏位的,那么我们可以直接点击菜单栏中的Rules--->Customize Rules
打开自定义规则对话框,这里其实应该说是会启动Fiddler ScriptEditor(Fiddler的脚本编辑器)
这里就是允许用户通过脚本来添加或自定义列
如图
然后我们按下键盘上的Ctrl+F查找关键字为static function Main()的字符串, 然后添加显示IP栏位的相关代码:
代码如下
FiddlerObject.UI.lvSessions.AddBoundColumn("栏位名称自定义", 120, "X-HostIP");
如图
这样一来在会话列表中就会显示请求服务器的的IP地址了!
如图
还有一点就是细心的朋友肯定发现在抓包的时候第一栏位除了显示请求顺序之外,还显示了请求的文件类型图标,也就是每个会话都标有一个对应的类型图标
如图
但是但通常不知道图标代表着什么意思,这里我就来给大家挨个解释一下:
如下表
icon | 含义 |
正在将请求发送到服务器 | |
正在从服务器读取响应 | |
请求在断点处暂停 | |
响应在断点处暂停 | |
请求使用HTTP HEAD方法;反应应该没有身体 | |
请求使用的 HTTP POST 方法 | |
请求使用HTTP连接方法;这将建立用于 HTTPS 流量的隧道 | |
响应是 HTML | |
响应是图像 | |
响应是一个JS脚本 | |
响应是级联样式表 | |
响应为 XML | |
响应为 JSON | |
响应是音频文件 | |
响应是视频文件 | |
响应是一个 Silverlight 小程序 | |
响应是一个 Flash 小程序 | |
响应是字体 | |
通用成功响应 | |
响应是 HTTP/300,301,302,303 或 307 重定向 | |
响应为 HTTP/304:使用缓存版本 | |
响应是对客户端凭据的请求 | |
响应是服务器错误 | |
会话被客户端、Fiddler 或服务器中止。 | |
表示请求的格式为html格式 | |
Fiddler中提供了很多对请求会话的复制操作,让你更好的去获取想要的数据!
你可以在会话列表中选择你要操作的会话, 然后右键选择copy
如图
其中子菜单含义如下表:
菜单名称 | 描述 |
Just URL | 复制请求的主机名+URL资源的路径 |
Terse Summary | 复制请求的方法+URL+响应状态 |
this Column | 复制当前请求中的本列信息 |
Headers Only | 以格式化形式复制当前会话的请求报文和响应报文 |
Session | 复制当前原始会话 跟Headers Only差不多 |
Response DataURL | 以及base64编码的形式复制响应数据的URL |
Full Summary | 复制当前会话信息和对应的列 |
根据需求进行选择就可以了!
Fiddler对会话的存储也制定了一些规则
你可以在会话列表中选择你要操作的会话, 然后右键选择save
其中save菜单下有四个选项
Selected Session(选定的会话) 旗下子菜单选项如下
如图
选项 | 描述 |
in ArchiveZIP | 把当前所选择的请求会话保存到.saz文件中 |
as Text | 把当前所选择的请求会话保存到文本文件中 包含请求报文+响应报文+响应体 |
as Text (Headers only) | 把当前所选择的请求会话保存到文本文件中 包含请求报文+响应报文 |
Request(请求)旗下子菜单选项如下
选项 | 描述 |
Entire Request | 把当前所选择的请求会话保存到文本文件中 只有请求报文 |
Request Body | 保存当前请求会话的请求正文为文本文件 |
Response(响应)子菜单如下:
选项 | 描述 |
Entire Response | 把当前所选择的请求会话保存到文本文件中 只有响应报文+响应体 |
Response Body | 保存当前请求会话的响应体为文本文件 |
...and Open as local File(作为本地文件打开)
这个选项的意思就是保存为本地的一个html文件 并且进行打开!
我们有时候保存会话查看时,会发现返回的响应体是乱码
如图
遇到这种问题,主要是需要解码就行了
在Inspectors 会话响应中点击Response body is encodee.click to decode后,重新保存就没乱码了。
也可以选中上图会话框上的decode按钮,这样就自动解码了
如图
其实如果你了解了http的基础知识,那么会话列表中的栏位信息也会很快的理解!
而你也不用每一个都去记住,要用的时候来查一查就行了!
状态栏上又分为几个小区域分别为:快速执行命令框(QuickExec)、
这个输入框的作用就是允许用户快速输入并启动一些脚本命令!
如图
一些关于QuickExec的键盘快捷键
比如点击 Alt+Q 可快速将焦点设置为快速执行命令框如果 Fiddler 未处于活动状态,请先按Ctrl+ALT+F激活 Fiddler
在快速执行命令框中,按 Ctrl+I 会在快速执行命令框中插入当前所选会话 URL
举个例子
我们可以在快速执行命令框输入 cls 或 clear命令来快速的清空会话列表
如图
常见命令如下表
命令 | 对应栏位 | 描述 | 案例 |
? | all | 问号后边跟一个字符串,可以从会话列表中筛选出包含这个字符串的所有请求 | ?baidu |
> | Body | 可以从会话列表中筛选出请求大小的会话,也就是大于这个数字请求 | >100 |
< | Body | 可以从会话列表中筛选出请求大小的会话,也就是小于这个数字请求 | <100 |
= | Result | 等于号后面跟数字,可以从会话列表中筛选出对应的HTTP状态码的会话 | =404 |
@ | Host | @后面跟Host,可以从会话列表中筛选出相应的域名 | @www.baidu.com |
select | Content-Type | select后面跟响应类型,可以从会话列表中筛选出相关的会话类型 | select image |
cls | All | 清空当前所有请求 | cls |
dump | All | 将所有请求打包成.saz压缩包,默认会保存到C:\Users\用户名\Documents\Fiddler2\Captures目录下 | dump |
start | All | 开始监听请求 | start |
stop | All | 停止监听请求 | stop |
.............. | .................................. | ................. |
更多命令 可以查看官方文档, 这里就不再过多赘述了,关于快速执行命令框后面的断点中还会用到!
All Processes可以对抓包进行筛选,可以根据自己情况选择。
如图
也就是说在抓包的时候,是显示所有会话进程还是浏览器请求的会话进程 还是不是浏览器请求的会话进程 或者全部隐藏,根据自己的需求进行选择就行了!
这个小区域,如果你用鼠标点击一下就会出现断点的设置
如图
状态 | 描述 |
意思就是请求之前断点, 也就是当这个状态启动的时候,那么你发送的请求就会卡在这里! | |
响应在断点处暂停, 也就是说服务器已经返回请求的数据了,但是被Fiddler在中间卡住了,还没有到客户端这一边! | |
........... |
关于断点我会后面会详细讲到!
状态栏的其他地方就是显示当前会话的数量以及当选所选择会话的URL地址
Fiddler中辅助标签工具栏算是用得比较多的,因为经常要在这里查看抓取数据包的详细信息!
接下来我就详细拆分辅助标签工具栏的各个区域来讲解!
用于查看请求的性能数据,统计与分析, 也就是说它就是对当前请求的性能分析数据
当你点击一个HTTP请求会话的时候,就可以看到Statistics里面有关于当前HTTP请求的性能以及数据分析!
例如: 一些TCP/IP的连接时间,DNS的解析时间、资源消耗、各个国家的请求网络带宽对比等信息
如图
如果你是一个专业的前端开发者,这些数据就应该重点关注一下!
你有没有想过在Fiddler中如何快速查看http请求与响应报文呢?
其实当我们在会话列表中双击某一个会话请求就会自动跳转到Inspectors选项卡
也就是当抓包成功之后, 就可以在左侧窗口中选择你要查看的地址来进行查看抓取的http信息数据, 当选择了相应的地址之后,在右侧选项卡中 选择Inspectors(检查器), 然后再点击一下Raw就可以按照原生形式来进行查看到相应的http请求报文与http响应报文, 分为上下两个部分,上半部分是请求头部分,下半部分是响应头部分。
如图
对于每一部分,提供了多种不同格式查看每个请求和响应的内容, Inspectors选项卡中还有其他的
Inspectors选项卡上半部分HTTP请求内容的子集选项卡如下表
名称 | 含义 |
Headers | 以层级的形式来显示HTTP请求头部的相关内容信息 |
TextView | 以文本的形式展示 |
SytaxView | 查看具体的请求体 或者附带的键与值 |
WebForms | 可以通过它看到url提交的相关参数信息 |
HexView | 以16进制进行查看请求! |
Auth | 查看请求数据权限 |
Cookie | 查看请求cookie信息 |
Raw | 原生查看http |
JSON | 以JSON格式展开查看请求信息! |
XML | 以xml格式展开查看请求信息! |
Inspectors选项卡下半部分HTTP响应内容 的子集选项卡如下表
名称 | 含义 |
Transformer | |
Headers | 以层级方式来展示HTTP响应头部信息 |
TextView | 以文本方式来展示HTTP响应正文信息 |
SyntaxView | 以语法高亮来展示HTTP响应正文信息 |
ImageView | 以图片的形式来展示响应信息, 前提是你选择的会话是一个图片响应 |
HexView | 以16进制来查看响应信息 |
Webview | 以html编译显示之后的形式来查看响应结果 |
Auth | 查看响应权限 |
Caching | 查看响应缓存相关信息 |
cookie | 查看响应cookie信息 |
Raw | 以原生格式展示响应信息 |
JSON | 以json展示响应信息 |
xml | 以xml展示响应信息 |
AutoResponder也叫做自动响应器
它允许你拦截指定规则的请求,并把响应结果重定向到一个本地资源 或 直接使用Fiddler内置的资源,从而代替服务器来自定义一个你想要的响应。 说白一点就是篡改响应
这个功能在我们做开发测试的时候也是非常有用的 ,使用它我们可以不影响用户体验的前提下进行测试!
举个例子 当我们请求百度页面的时候, 抓取到其中一个百度logo图片会话,最后把这个图片会话响应给替换成其他资源!
首先我们可以在Fiddler中的Inspectors结合会话列表找到这个图片的连接资源URL地址: 可能有多个
例如
然后切换到AutoResponder选项卡, 在Rule Editor规则编辑中填入要请求的资源地址和替换成的响应,最后点击save保存一下, 就可以了!
温馨提醒 最好要把以下这3个复选框勾上!
Enable Rules(启用规则)
Accept all connects(接受所有连接)
Unmatched requests passthrough(不匹配的请求传递)
如图
那么下一次你再次请求百度页面的时候,如果再次遇见到这个百度logo图片的资源地址,那么请求就会被中间层的Fiddler所劫持并篡改成为我们设置的某个响应资源,并返回给客户端, 明白了吧, 这个响应不是从服务器回来的,而是我们人为篡改的!
注意测试的时候,最好使用去缓存刷新来测试, 浏览器快捷键shift+F5
效果如图
Fiddler其实还有很多内置的响应规则,根据实际情况和需求来决定如何测试
如图
我们还可以自定义编辑响应也就是Edit Response
举个例子 我们可以直接编辑服务器返回响应信息的详细内容,然后再返回给客户端
如图
效果如下
响应都可以随便篡改 Fiddler还有什么事情不能做的!
总之通过这种中间截获的手段并篡改响应资源的手法就可以实现很多资源响应的修改,你也可以修改html、css、js等资源都是可以的 ,这极大方便了我们做开发模拟请求和响应测试!
它可以允许我们自定义请求报文来发送到服务端,当然也可以手动创建一个新的请求,也可以从会话列表中拖拽一个现有的请求去发送!
在Parsed(解析模式)下我们只需要提供简单的URL地址就可以了, 并且还可以在RequestBody中去定制一些属性,例如模拟浏览器消息头User-Agent
但是Composer通常在我们开发项目当中用于接口测试 也是经常用于测试一些api接口的最好方法!
当然有时候也可以通过Composer来校验后端接口的严谨,从而跳过一些前端的限制,去直接访问后端代码的逻辑!
Composer下还有几个子集选项卡:Parsed、Raw、Scratchpad、Options
具体解释如下表:
选项卡 | 描述 |
Parsed | 表示已经被解析的整个HTTP请求,包括请求行,请求头和请求体,说通俗一点也就是最直观的看到Request请求的详细展示 |
Raw | 按照真实原生HTTP请求标准来进行展示的格式! |
Scratchpad | 可以存储已经收集好的HTTP请求,可存储多个不同的请求, 你可以理解为请求回放功能, 鼠标连续点击三次即可选中要选择的请求来进行发送! |
Options | 设置一些请求选项 |
其中options中的设置项如下表:
名称 | 描述 |
Inspect Session | 检查会话,当开启此功能并重放的时候,会自动跳入Inspectors功能模块,进行检查HTTP请求和响应。 |
Fix Content-Length header | 当使用POST请求进行重放的时候,如果没有Content-Length的请求头,Fiddler会自动加上此请求头,如果有但是请求正文大小错误,则它会自动修正。默认勾选。 |
Follow Redirects | 会自动重定向301,302的请求。 |
Automatically Authenticate | 自动进行身份认证,包括认证NTLM,http 401,http 407 |
UI Options | 此功能是在原有的Fiddler功能选项里面,将Composer这个功能弹出一个浮动窗口,如果不需要直接关闭这个窗口就会恢复原样。 |
.................................................. |
我们用得最多的也就是Parsed(详细展示请求结构)
如图
举个例子 我们用图灵机器人来测试一个POST请求的智能聊天对话接口!
图灵机器人接口信息
接口信息 | 描述 |
http://openapi.turingapi.com/openapi/api/v2 | 接口地址 |
请求方式 | HTTP POST |
请求参数 | 请求参数格式为 JSON |
参数格式
{
"perception": {
"inputText": {
"text": "聊天文字"
},
},
"userInfo": {
"apiKey": "申请的key",
"userId": "随机32位字符串"
}
}
文档说明 https://www.kancloud.cn/turing/www-tuling123-com/718227
操作流程
那么使用Fiddler调试一个POST请求并带有json格式的数据,我们可以打开Composer面板, 在Composer面板中的第一个下拉框中选择POST请求方式,然后输入请求接口的地址!
在Request Headers中也可以输入一些请求头信息,也可以不输入,它会帮你自动生成
然后在Request Body中输入请求的JSON数据
最后点击Execute(执行),若在会话列表中看到结果返回200表示操作成功!
如图
这个时候,我们就可以在Inspectors里面查看到请求响应的结果了!
如图
如果返回的JSON数据格式不清楚,其实你可以拿到一些数据格式化网站上去格式化一下就可以了
如图
再举个例子 我们再请求一个GET请求
如图
这样就可以返回数据了!
以上这些都是测试的第三方接口,如果是你自己写的api接口也是可以这样子来测试的!
总而言之:Composer可以帮助你去发送数据包,帮助你去做一些接口测试,帮助你去做一些平常没办法做到的一些测试!??
Filters本意就是过滤的意思, 它的主要作用就是用来过滤请求用的, 要知道有的时候 会话列表中或存在大量的请求会话, 那么有些时候会根据用户的条件进行一个会话筛选, 也就是说通过过滤规则来过滤掉那些不想看到的请求!
Filters选项卡也是在我们抓包过程中使用频率非常高的,其中功能也比较多,这里我把它内部的功能逐一拆解分成7个部分来进行讲解!
如图
1.Hosts 这是Filters对主机的过滤规则设置!
如图
我们使用Filters的时候就必须要勾选左上角的Use Filters(选择过滤器)开启过滤器, 勾选了之后Filters选项卡会出现绿色对钩, 记住这个勾选之后,过滤器才会生效
并且这里还有两个请求过滤条件:Zone和Host
Zone(区域): 下拉列表中可以选择如下:
show only Intranet Hosts(只显示局域网的请求)
show only Internet Hosts(只显示广域网的请求)
如图
那么这到底代表什么意思呢?
举个例子 我们来请求baidu试试!
如图
如果设置为了show only Intranet Hosts 那么外网的请求会话是无法获取到的,智能获取内网请求
如果设置为了show only Internet Hosts那么相反也智能获取外网的请求,而内网的请求是无法获取到的!
平常如果我们没有其他特殊需求的情况下Zone都被默认设置为了No Zone Filter(不用区域过滤)
注意:各位要留意 Intranet(内网) 和 Internet(因特网) 这两个单词很多人容易搞混!
Host(主机):下拉列表中可以选择如下:
如图
含义解释:
Hide the following Hosts(隐藏下列指定的主机的请求)
show only the following Hosts (仅显示以下指定主机的请求)
Flag the following Hosts(标记以下主机)
举个例子 比如说: 我设置其中一个show only the following Hosts (仅展示以下指定主机的请求) 那么会话列表中只会出现我所指定的主机请求会话,其他一概不显示!
注意: 这里设置之后 要点击一下Actions中的Run Filterset now(运行过滤)
如图
另外两个根据自己需求设置就行了, 平常没特殊需求我们也是设置的No Host Filter
2.Client Process 这是对客户端进程的一些过滤设置!
如图
其中有三个复选框:
show only traffic from (仅显示当前客户端指定进程的请求)
show only Internet Explorer traffic (仅显示Internet Explorer请求)
Hide trafficfrom Service Host (对服务主机隐藏请求)
举个例子 我仅显示ie浏览器的请求会话,其他浏览器的请求会话一概不显示!
如图
看到了吧,这对某一些需求上还是有一定帮助的!
3.Request Headers 这是对请求头的一些过滤规则
如图
其中有几个复选框功能如下表:
名称 | 描述 |
show only if URL contains | 仅展示当前URL中包含指定内容的请求会话 |
Hide if URL contains | 隐藏当前URL中包含指定内容的请求会话 |
Flag request with headers | 用头标记请求, 标记带有特定header的请求,如果在web session列表中存在该请求,会加粗显示。 例如,我想突出显示header信息中带有token字段的URL请求,即可以勾选上这项,并在后面输入:token。 |
Delete request headers | 删除请求头, 也就是说在请求的过程当中会删除指定的Header字段。我们在进行测试时非常有用,比如说去掉URL中的Content-Type信息 |
set request header | 设置请求头, 也就是说可以在请求头中自定义请求头信息,前面输入字段,后面输入值, 这就是我们可以进行自定义请求头内容 |
..................................................................... |
举个例子
例如: 勾选show only if URL contains只会显示指定包含这个内容的 响应会话
如图
例如: 勾选set request header然后我们自定义一个header头信息 然后去发送一个请求
如图
然后我们可以在Inspectors中查看到请求头就有我们所自定义的头信息了, 有的时候做一些特殊调试还是能够起很大帮助的!
如图
4.Breakpionts 断点设置
这个功能有的时候也非常重要!
功能解释如下表:
功能 | 描述 |
Break request on Post | 针对所有POST请求设置断点。 |
Break request on GET with query string | 给所有带参数的 GET 请求设置断点 |
Break on XMLHttpRequest | 针对所有Ajax请求设置断点。 |
Break response on Content-type | 针对响应报文中header字段中,Content-Type属性匹配成功的请求设置断点 |
.............................................................................................. |
关于请求断点后面单独拿一章节来说!
5.Response Status Code(请求状态码过滤)
这一部分的功能,很简单就是看状态码进行会话的过滤
如图
功能解释如下表:
功能 | 描述 |
Hide success(2xx) | 隐藏响应状态码为2xx的URL请求,如:响应状态码为200的URL请求将隐藏掉 |
Hide non-2xx | 隐藏响应状态码不是2xx的URL请求。 |
Hide Authentication demands(401,407) | 隐藏认证(响应状态码为:401 407)的URL 请求。这些响应需要用户进一步确认证书,authentication demands是认证需求的意思。 |
Hide redirects(300,301,302,303,307) | 隐藏重定向(响应状态码为:300,301,302,303,07)的URL请求。 |
Hide Not Modifield(304) | 隐藏不是缓存的状态码(304)的URL请求, 因为304是请求的资源从上次起没有发生变更返回的状态码。 |
............................................................................................. |
举个例子
我们勾选Hide success(2xx) 返回的请求会话中是不会包含2xx状态码的请求
6.Response Type and Size (根据响应类型和大小进行过滤)
如图
Show all Content-Type 这一项比较常用, 意思为显示所有指定Content-Type类型的请求
其中的选项描述如下表:
功能 | 描述 |
Show only IMAGE/* | 仅显示响应类型为图片的请求, 即响应header中Content-Type=IMAGE/的请求,*为通配符 |
Show only HTML | 仅显示响应类型为HTML的请求。 |
Show only TEXT/CSS | 仅显示响应类型为text/css的请求。 |
Show only SCRIPTS | 仅显示响应类型为Scripts的请求 |
Show only XML | 仅显示响应类型为XML的请求。 |
Show only JSON | 仅显示响应类型为json的请求。 |
Hide IMAGE/* | 隐藏所有响应类型为图片的请求。 |
.............................................. |
其他功能项如下表
功能 | 描述 |
Hide smaller than | 隐藏小于指定大小响应结果的请求,大小可以在 Inpsectors 中响应结果部分的 Transformer 中查看 |
Hide larger than | 隐藏大于指定大小响应结果的请求 |
Time HeatMap | 时间的热图。 |
Block script files | 阻止返回正常JS文件。如果响应是脚本文件,那么响应 404。 |
Block image files | 阻止返回正常图片文件。如果响应是图片文件,那么响应 404 |
Block SWF files | 阻止返回正常SWF文件。如果响应是SWF 文件,那么响应 404。 科普一下swf(shock wave flash):是Macromedia公司的目前已被adobe公司收购)公司的动画设计软件Flash的专用格式 |
Block CSS files | 阻止返回正常CSS文件。如果响应是 CSS 文件,那么响应 404 |
.............................................. |
举个例子 比如我们禁止掉页面上的css js 等资源看看请求的结果是什么样子的!
如图
效果
那么此时请求的页面将会失去css 、js、图片等资源, 让他们都响应为404状态
以上这些功能可以测试一些资源等加载失败的情况下页面的展示情况, 前端必备哦!
7.Response Header (根据响应头信息进行过滤)
如图
功能详解如下表:
功能 | 描述 |
Flag responses that set cookies | 会话列表的响应中有cookies信息的加上标识斜体 |
Flag responses with headers | 会话列表里标记响应中带有特定header的请求 即加粗。 |
Delete response headers | 会话列表里删除响应信息中,就是说没有发给客户端之前就把这些响应头删除掉! |
Set response header | 在响应中添加header字段, 也就是自定义响应头信息,再发给客户端 |
............................................................................ |
小结 有些新手朋友在使用Fiddler的时候出现抓包失灵的情况,可能就是你在Filters选项卡中勾选了什么东西才导致的! 所以使用过滤器要注意一下!
所谓断点功能就是将你的请求或者响应截获下来,但是不发送也不返回,都放到Fiddler这里, 这个时候你可以做很多事情,比如说,把请求报文改了,或 响应报文改了,再发送给服务器 或 客户端
还记得前面状态栏说过的小空白区域吗? 点击这个区域就会出现断点标志符号,如下表:
状态 | 描述 |
意思就是请求之前断点, 也就是当这个状态启动的时候,那么你发送的请求就会卡在这里! | |
........... |
以上状态图标其实对应的也就是菜单栏中的Rules--->Automatic Breakpoints--->Before Request
如图
举个例子
我们请求某个网站之前就先把这个断点打开, 那么在请求的时候, 会话列表中所对应的请求也会呈现断点状态的图标, 会话列表中URL所对应的网站也是无法显示出来的, 因为此时此刻请求还未发到服务器。中间被Fiddler所截获 ,那么现在就可以做一些数据和请求信息上的修改
然后等确定要发送到服务器的时候就点击Run to Completion(完成) 把这一个请求发送到服务器端就可以了 !
如图
注意 点击Run to Completion(完成) 只是把当前所选择到的会话解除断点,让它发送到服务器端,从而响应
状态 | 描述 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LaOqoiWK-1651910920401)(img/Icon_4.png)] | 响应在断点处暂停, 也就是说服务器已经返回请求的数据了,但是被Fiddler在中间卡住了,还没有到客户端这一边, 所以当我们开启了这个状态,那么在响应之前就会卡主! |
............. |
当我们再次点击一下的时候就会切换到以上状态图标
其实对应的也就是菜单栏中的Rules--->Automatic Breakpoints--->After Request
而After Request(请求之后断点) 和 Before Request(请求之前断点)正好相反
如图
举个例子
还是请求某个网站之前就先把这个请求后断点打开, 那么此时响应信息已经返回了,但是被的时候Fiddler卡主了, 会话列表中所对应的请求也会呈现请求后断点的图标, 会话列表中URL所对应的网站也是无法显示 或者 无法提取最新的页面信息, 因为此时此刻响应还未发到客户端。返回途中被Fiddler所截获
那么如果可以的话,现在就能做一些响应报文信息上的修改
然后等确定要发送到客户端的时候就点击Run to Completion(完成) 把这一个响应发送到客户端就可以了 !
如图
所以在Fiddler拿到响应信息的时候,先断住,然后篡改一些信息之后再发给客户端!
大家还记得状态栏上的快速命令执行框吗? 在这里也可以输入来执行一些命令断点
如图
那么一些常见的断点命令如下表:
命令 | 描述 | 案例 | 解除断点 |
bpafter | bpafter后边跟一个字符串,表示中断所有包含该字符串的请求 | bpafter baidu | 输入bpafter解除断点 |
bpu | 跟bpafter功能差不多, | bpu baidu | 输入bpu解除断点 |
bpv | 只中断HTTP方法的命令,HTTP方法如POST、GET | bpv get | 输入bpv解除断点 |
bpm | 只中断HTTP方法的命令,HTTP方法如POST、GET | bpm get | 输入bpm解除断点 |
go | 放行中断下来的请求,相当于工具栏上的go按钮 | go | |
................................... | ......................................... |
弱网在Fiddler中就是设置网络限速 简单理解也就是在网络不好 或者 网络环境复杂、使用场景多变异常、网络抖动、延时、丢包的环境下进行检查的一种方式 就叫弱网测试
举个例子
一款适配于低资源环境的医疗it系统项目来说,而它的使用场景主要是在一些2G网络环境下,3G网都很少,并且稳定性也是比较差。因此这款网站应用或app应用要想完成交付,就一定要在弱网状态甚至在没有网络状态下运行, 看看是不是能够正常交付!
所以我们要模拟一个弱网环境进行测试 通过Fiddler软件方式利用模拟网络参数来配置弱网环境,就可以达到对带宽、丢包、延时等进行模拟弱网环境目的
在windows环境下我们通常可以使用fiddler和network emulator for windows toolkit来模拟
在mac环境下则可以使用Charles和Xcode自带的开发环境网络异常模拟工具进行测试
在左侧的会话列表窗口选择一个或多个会话,再切换到Timeline选项卡中 便会显示指定的资源从服务端传输到客户端的响应时间!
如图
从上图来看 似乎都属于正常的网络延迟范围之内吧!
那么我们现在就利用Fiddler这个软件来设置一下网络延迟,让网络限速
方法也很简单从Fiddler的菜单栏上选择Rules---->Performance--->Simulate Modem Speeds(模拟调制解调器速度)就可以了!
如图
当我们勾选了Simulate Modem Speeds(模拟调制解调器速度) 之后你在测试一下请求某个网页看看响应时间就知道了!
如图
看到了吧 很明显某些资源请求的时长增加了!
那么到底Fiddler给我们限制了多少网速呢 ?
其实我们可以通过脚本去查看和设置,在Fiddler菜单栏选择Rules--->Customize Rules(自定义规则)
打开Fiddler ScriptEditor编辑器,然后按下Ctrl+ F来搜索关键字Simulate(模拟的意思) 找到if判断的m_SimulateModem变量
如图
以上的代码中写明了注释:
Delay sends by 300ms per KB uploaded意思是每上传1KB延迟发送 要花费300毫秒
Delay receives by 150ms per KB downloaded意思是延迟每下载1KB接收要花费150毫秒
要知道这里的单位是毫秒 而1秒=1000毫秒 那么知道了这个之后,我们就可以手动的来设置网络延迟了!
如图
也就是说我现在发一个请求上传也要1.3秒,并且每一个资源的下载时间也要1.5秒
设置之后保存即可! 就可以再去Timeline中查看一下请求会话的响应时间了!
注意: Simulate Modem Speeds(模拟调制解调器速度) 依旧要为勾选状态!
如图
是不是比刚才很卡了呢!
小结
总之弱网测试的目的就是尽可能保证用户体验, 也就是说我们的项目或页面的数据响应时间是否可以被用户所接受, 常见的一些关注点包含如下:
补充扩展
当然这里要多说一句 软件模拟弱网方式是由一定的弊端的,因为不是非常接近弱网络环境,想要更接近弱网环境,例如大多数专业项目的测试2G/3G/4G、高延时、高丢包、响应时间、页面呈现&超时文案&超时重连、安全及大流量风险、无网多状态切换等会更倾向于通过硬件方式来协助测试,但这种方式又会变得很麻烦,都是通过树莓派 但是软件方式的成本低且实施起来容易操作而已!
"点赞" "评论" "收藏"
大家的支持就是我坚持创作下去的动力!?
?如果以上内容有任何错误或者不准确的地方,欢迎在下面 留个言指出、或者你有更好的想法,欢迎一起交流学习?
*请认真填写需求信息,我们会在24小时内与您取得联系。