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 optparse模块使用实例
Apr 09 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python导出hive数据表的schema实例代码
Jan 22 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
Python之批量创建文件的实例讲解
May 10 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
python字符串的一些常见实用操作
Apr 06 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微信公众平台示例代码分析(二)
2016/12/06 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python函数嵌套实例
2014/09/23 Python
详解python之协程gevent模块
2018/06/14 Python
对pandas中Series的map函数详解
2018/07/25 Python
实例讲解python中的序列化知识点
2018/10/08 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
高级护理实习生自荐信
2013/09/28 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
农民工创业典型事迹
2014/01/25 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
MySQL 数据类型详情
2021/11/11 MySQL
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android