前言 HTTP Archive (HAR) format 是http协议交互的归档格式。 这个格式在本质上是utf8格式的json字符串,存储着所有的http请求和http响应的数据,包括所有的head和body。 如何获取HAR格式 一般,很多proxy类的工具,如fiddler,charles,原来一直以为charles不支持保存为har格式,后来才知道是在 export 菜单里面:
通过代理和反向代理获取http报文 在charles中,支持代理,反向代理,端口转发 这三种主要的方法获取交互的报文。 1. 代理模式:这个是普通的代理,proxy模式,浏览器都支持。 2. 反向代理:简单说是代理服务器,对于不支持设置代理的应用,如接口类,可以通过这个来获取报文。
3. 端口转发:这个功能更强大,基于tcp,udp层的,对于Socket类的都能录到报文。一般如果不知道是什么协议的, 可以用这个,如果判断是http协议的, 好用反向代理模式的,这样可以更直观的看到解析后的报文。 解析har 通过代理和反向代理的方式,可以获取到http报文,导出为har格式后,进行解析,可以直接生成测试脚本,以生成loadrunner 脚本为例。 基于python的脚本如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from optparse import OptionParser import os import sys import json # check env if sys.version_info < (3, 4): raise RuntimeError('At least Python 3.4 is required.') restype = ('js', 'css', 'jpg', 'gif', 'ico', 'png') def list2dic(headers): header_dic = dict() for head in headers: if head['name'] in header_dic: header_dic[head['name']] = header_dic[head['name']] + ',' + head['value'] else: header_dic[head['name']] = head['value'] return header_dic def dictoand(dct): res_list = list() for tp in dct: res_list.append('%s=%s' % (tp['name'], tp['value'])) return '&'.join(res_list) def dict2lr(lrsc): tmpl = ''' web_custom_request("%(name)s", "URL=%(url)s", "Method=%(method)s", "Resource=%(res)s", "Referer=%(referer)s", "EncType=%(enctype)s", "Body=%(body)s", LAST);''' # url url = lrsc['url'] method = lrsc['method'] name = url.split('/')[-1] name = name.split('?')[0] suff = url.split('.')[-1] # Resource type global restype res = '0' if suff in restype: res = '1' # Content-Type enctype = '' if 'Content-Type' in lrsc: enctype = lrsc['Content-Type'] # Referer referer = '' if 'Referer' in lrsc: referer = lrsc['Referer'] # Body body = '' if 'posttext' in lrsc: body = lrsc['posttext'] elif 'postparams' in lrsc: body = dictoand(lrsc['postparams']) body = body.replace('"', '\"') res = tmpl % {'name': name, 'url': url, 'method': method, 'enctype': enctype, 'referer': referer, 'res': res, 'body': body} # Head if 'SOAPAction' in lrsc: res = (" " + ' web_add_header("SOAPAction", "%s")' + "; " + res) % lrsc['SOAPAction'] return res def parhar(harfile): res = list() try: FH = open(harfile, mode='r', encoding='utf-8', closefd=True) all = json.load(FH) FH.close() except Exception as ex: print('Open har file errr: %s' % ex) quit() har_ver = all['log']['version'] creater = all['log']['creator']['name'] entries = all['log']['entries'] ct = len(entries) for et in entries: stm = et['startedDateTime'] req = et['request'] rsp = et['response'] lrsc = dict()