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捕捉和模拟鼠标事件的方法
Jun 03 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
python 调用钉钉机器人的方法
Feb 20 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
python mock测试的示例
Oct 19 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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 数据结构 算法 三元组 Triplet
2011/07/02 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python中字符串类型json操作的注意事项
2017/05/02 Python
深入理解Django中内置的用户认证
2017/10/06 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python处理RSTP视频流过程解析
2020/01/11 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Python如何将函数值赋给变量
2020/04/28 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
英文自荐信
2013/12/19 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
美术教师个人工作总结
2015/02/06 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
仰望星空观后感
2015/06/10 职场文书
给朋友的赠语
2015/06/23 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL