前言
  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()