Python 3.x基于Xml数据的Http请求方法


Posted in Python onDecember 28, 2018

1. 前言

由于公司的一个项目是基于B/S架构与WEB服务通信,使用XML数据作为通信数据,在添加新功能时,WEB端与客户端分别由不同的部门负责,所以在WEB端功能实现过程中,需要自己发起请求测试,于是便选择了使用Python编写此脚本。另外由于此脚本最开始希望能在以后发展成具有压力测试的功能,所以除了基本的访问之外,添加了多线程请求。

整个脚本主要涉及到的关于Python的知识点包括:

基于urllib.request的Http访问

多线程

类与方法的定义

全局变量的定义与使用

文件的读取与写入

……

2. 源码与结果

整个程序包括Python源码和配置文件,由于源码中有相应的注释,所以就直接贴源码吧,如下:

# TradeWeb测试脚本
import threading, time, http.client, urllib.request, os
#import matplotlib.pyplot as plt

URL = 'http://127.0.0.1:8888/XXXXXXXXX/httpXmlServlet' # 在配置文件中读取,此处将无效

TOTAL = 0; # 总数
SUCC = 0; # 响应成功数量
FAIL = 0; # 响应失败数量
EXCEPT = 0 # 响应异常数 
MAXTIME = 0 # 最大响应时间 
MINTIME = 100 # 最小响应时间,初始值为100秒
COUNT_TIME = 0 # 总时间
THREAD_COUNT = 0 # 记录线程数量
CODE_MAP = {200:0, 301:0, 302:0, 304:0} # 状态码信息(部分)
RESULT_FILE = 'tradeWebResult.xml'  # 输出结果文件
REQUEST_DATA_FILE = 'requestData.config'  # 数据文件

DATA = '''请在tradeWebRequestData.config文件中配置'''

TIME_LIST = [] # 记录访问时间

#创建一个threading.Thread的派生类
class RequestThread(threading.Thread):
 #构造函数
 def __init__(self, thread_name):
 threading.Thread.__init__(self)
 self.test_count = 0;

 #线程运行的入口函数
 def run(self):
 global THREAD_COUNT
 THREAD_COUNT += 1
 #print("Start the count of thread:%d" %(THREAD_COUNT))
 self.testPerformace()

 #测试性能方法
 def testPerformace(self):
 global TOTAL 
 global SUCC 
 global FAIL 
 global EXCEPT 
 global DATA
 global COUNT_TIME
 global CODE_MAP
 global URL
 try:
  st = time.time() #记录开始时间

  start_time
  cookies = urllib.request.HTTPCookieProcessor()
  opener = urllib.request.build_opener(cookies)

  resp = urllib.request.Request(url=URL,
     headers={'Content-Type':'text/xml', 'Connection':'Keep-Alive'},
     data=DATA.encode('gbk'))

  respResult = opener.open(resp)

  # 记录状态码 START
  code = respResult.getcode()
  if code == 200:
  SUCC += 1
  else:
  FAIL += 1

  if code in CODE_MAP.keys():
  CODE_MAP[code] += 1
  else:
  CODE_MAP[code] = 1

  # print(request.status)
  # 记录状态码 END  

  html = respResult.read().decode('gbk')
  print(html)

  time_span = time.time() - st # 计算访问时间

  # 记录访问时间
  TIME_LIST.append(round(time_span * 1000))

  # print('%-13s: %f ' %(self.name, time_span))

  self.maxtime(time_span)
  self.mintime(time_span)

  self.writeToFile(html)

  # info = respResult.info() # 响应头信息
  # url = respResult.geturl() # URL地址
  # print(info);
  # print(url)

  COUNT_TIME += time_span
  TOTAL += 1
 except Exception as e:
  print(e)
  TOTAL += 1
  EXCEPT += 1

 # 设置最大时间,如果传入的时间大于当前最大时间
 def maxtime(self, ts):
 global MAXTIME
 #print("time:%f" %(ts))
 if ts > MAXTIME:
  MAXTIME = ts

 # 设置最小时间,如果传入的时间小于当前最小时间
 def mintime(self, ts):
 global MINTIME
 #print("time:%f" %(ts))
 if ts < MINTIME and ts > 0.000000000000000001:
  MINTIME = ts

 # 写入文件
 def writeToFile(self, html):
 f = open(RESULT_FILE, 'w')
 f.write(html)
 f.write('\r\n')
 f.close();

# 读取XML数据信息
def loadData():
 global URL
 global DATA

 f = open(REQUEST_DATA_FILE, 'r')
 URL = "".join(f.readline())
 DATA = "".join(f.readlines())

 # print(DATA)

 f.close()


if __name__ == "__main__":
 # print("============测试开始============")
 print("")
 # 开始时间
 start_time = time.time()
 # 并发的线程数
 thread_count = 1

 loadData() # 加载请求数据

 i = 0
 while i < thread_count:
 t = RequestThread("Thread" + str(i))
 t.start()
 i += 1

 t = 0
 while TOTAL < thread_count and t < 60:
 # print("total:%d, succ:%d, fail:%d, except:%d\n" %(TOTAL,SUCC,FAIL,EXCEPT))
 print("正在请求 ",URL)
 t += 1
 time.sleep(1)

 # 打印信息
 print()
 print("请求", URL, "的统计信息:")
 print(" 总请求数 = %d,成功 = %d,失败 = %d,异常 = %d" %(TOTAL, SUCC, FAIL, EXCEPT))
 print()
 print("往返程的估计时间(以毫秒为单位):")
 print(" 合计 =", int(COUNT_TIME * 1000), "ms", end = '')
 print(" 最大 =", round(MAXTIME * 1000), "ms", end = '')
 print(" 最小 =", round(MINTIME * 1000), "ms", end = '')
 print(" 平均 =", round((COUNT_TIME / thread_count) * 1000), "ms")
 print()
 print("响应的状态码与次数信息(状态码:次数):")
 print(" ", CODE_MAP)
 print()
 print("输出页面请查看", RESULT_FILE, "文件(建议使用浏览器或XML专业工具打开)")
 print()
 # os.system("pause")

 print(TIME_LIST)
 input()

配置文件主要在于易于更改访问路径等,其中SESSION_ID是在Fiddler中抓包获取,配置文件源文件如下(为不泄露公司隐私,数据并非原始数据,但格式相同):

http://127.0.0.1:8888/XXXXXXXXX/httpXmlServlet

<?xml version=“1.0” encoding = “GB2312”?>
<COM>
<REQ name="commodity_query">
<USER_ID>0001</USER_ID>
<COMMODITY_ID>0000</COMMODITY_ID>
<SESSION_ID>4918081208706966071</SESSION_ID>
</REQ>
</COM>

测试结果如下:

Python 3.x基于Xml数据的Http请求方法

由于公司保密性要求,地址做了模糊处理,另外输出的tradeWebResult.xml结果页面也未展示。

以上仅为个人学习与使用Python过程的一个记录,难免会有程序设计或使用不当,如有更好的意见,欢迎指正。

注:此代码开发环境为Python 3.5 + windows,未在Python 2.x环境下测试

以上这篇Python 3.x基于Xml数据的Http请求方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python登录QQ邮箱发信的实现代码
Feb 10 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
Python中psutil的介绍与用法
May 02 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
解决python 文本过滤和清理问题
Aug 28 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python模拟登陆,用session维持回话的实例
Dec 27 #Python
python requests post多层字典的方法
Dec 27 #Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 #Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 #Python
python 与服务器的共享文件夹交互方法
Dec 27 #Python
通过pykafka接收Kafka消息队列的方法
Dec 27 #Python
python利用thrift服务读取hbase数据的方法
Dec 27 #Python
You might like
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
python爬虫实现中英翻译词典
2019/06/25 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python、Matlab求定积分的实现
2019/11/20 Python
Python 可视化神器Plotly详解
2020/12/26 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
医生实习工作总结的自我评价
2013/09/27 职场文书
毕业设计致谢语
2015/05/14 职场文书