欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-10 22:46:37
1. 前言 由于公司的一个项目是基于b/s架构与web服务通信,使用xml数据作为通信数据,在添加新功能时,web端与客户端分别由不同的部门负责,所以在web端功能实现过...

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请求方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。