中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 3.x基于Xml數據的Http請求方法

發布時間:2020-08-21 12:22:26 來源:腳本之家 閱讀:161 作者:BarackHusseinObama 欄目:開發技術

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請求方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 昔阳县| 成安县| 那坡县| 瑞昌市| 凤城市| 静海县| 德庆县| 肇源县| 平利县| 平度市| 台南市| 修文县| 扎赉特旗| 荔波县| 横峰县| 普安县| 尤溪县| 景洪市| 巫山县| 历史| 惠安县| 霍山县| 牟定县| 从化市| 招远市| 桐乡市| 葫芦岛市| 昌邑市| 临武县| 平度市| 青岛市| 积石山| 乐安县| 长海县| 石泉县| 福建省| 兴义市| 扎鲁特旗| 台江县| 开原市|