欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法

 更新時(shí)間:2018年12月28日 08:43:43   作者:BarackHusseinObama  
今天小編就為大家分享一篇Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1. 前言

由于公司的一個(gè)項(xiàng)目是基于B/S架構(gòu)與WEB服務(wù)通信,使用XML數(shù)據(jù)作為通信數(shù)據(jù),在添加新功能時(shí),WEB端與客戶(hù)端分別由不同的部門(mén)負(fù)責(zé),所以在WEB端功能實(shí)現(xiàn)過(guò)程中,需要自己發(fā)起請(qǐng)求測(cè)試,于是便選擇了使用Python編寫(xiě)此腳本。另外由于此腳本最開(kāi)始希望能在以后發(fā)展成具有壓力測(cè)試的功能,所以除了基本的訪(fǎng)問(wèn)之外,添加了多線(xiàn)程請(qǐng)求。

整個(gè)腳本主要涉及到的關(guān)于Python的知識(shí)點(diǎn)包括:

基于urllib.request的Http訪(fǎng)問(wèn)

多線(xiàn)程

類(lèi)與方法的定義

全局變量的定義與使用

文件的讀取與寫(xiě)入

……

2. 源碼與結(jié)果

整個(gè)程序包括Python源碼和配置文件,由于源碼中有相應(yīng)的注釋?zhuān)跃椭苯淤N源碼吧,如下:

# TradeWeb測(cè)試腳本
import threading, time, http.client, urllib.request, os
#import matplotlib.pyplot as plt

URL = 'http://127.0.0.1:8888/XXXXXXXXX/httpXmlServlet' # 在配置文件中讀取,此處將無(wú)效

TOTAL = 0; # 總數(shù)
SUCC = 0; # 響應(yīng)成功數(shù)量
FAIL = 0; # 響應(yīng)失敗數(shù)量
EXCEPT = 0 # 響應(yīng)異常數(shù) 
MAXTIME = 0 # 最大響應(yīng)時(shí)間 
MINTIME = 100 # 最小響應(yīng)時(shí)間,初始值為100秒
COUNT_TIME = 0 # 總時(shí)間
THREAD_COUNT = 0 # 記錄線(xiàn)程數(shù)量
CODE_MAP = {200:0, 301:0, 302:0, 304:0} # 狀態(tài)碼信息(部分)
RESULT_FILE = 'tradeWebResult.xml'  # 輸出結(jié)果文件
REQUEST_DATA_FILE = 'requestData.config'  # 數(shù)據(jù)文件

DATA = '''請(qǐng)?jiān)趖radeWebRequestData.config文件中配置'''

TIME_LIST = [] # 記錄訪(fǎng)問(wèn)時(shí)間

#創(chuàng)建一個(gè)threading.Thread的派生類(lèi)
class RequestThread(threading.Thread):
 #構(gòu)造函數(shù)
 def __init__(self, thread_name):
 threading.Thread.__init__(self)
 self.test_count = 0;

 #線(xiàn)程運(yùn)行的入口函數(shù)
 def run(self):
 global THREAD_COUNT
 THREAD_COUNT += 1
 #print("Start the count of thread:%d" %(THREAD_COUNT))
 self.testPerformace()

 #測(cè)試性能方法
 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() #記錄開(kāi)始時(shí)間

  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)

  # 記錄狀態(tài)碼 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)
  # 記錄狀態(tài)碼 END  

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

  time_span = time.time() - st # 計(jì)算訪(fǎng)問(wèn)時(shí)間

  # 記錄訪(fǎng)問(wèn)時(shí)間
  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() # 響應(yīng)頭信息
  # url = respResult.geturl() # URL地址
  # print(info);
  # print(url)

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

 # 設(shè)置最大時(shí)間,如果傳入的時(shí)間大于當(dāng)前最大時(shí)間
 def maxtime(self, ts):
 global MAXTIME
 #print("time:%f" %(ts))
 if ts > MAXTIME:
  MAXTIME = ts

 # 設(shè)置最小時(shí)間,如果傳入的時(shí)間小于當(dāng)前最小時(shí)間
 def mintime(self, ts):
 global MINTIME
 #print("time:%f" %(ts))
 if ts < MINTIME and ts > 0.000000000000000001:
  MINTIME = ts

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

# 讀取XML數(shù)據(jù)信息
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("============測(cè)試開(kāi)始============")
 print("")
 # 開(kāi)始時(shí)間
 start_time = time.time()
 # 并發(fā)的線(xiàn)程數(shù)
 thread_count = 1

 loadData() # 加載請(qǐng)求數(shù)據(jù)

 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("正在請(qǐng)求 ",URL)
 t += 1
 time.sleep(1)

 # 打印信息
 print()
 print("請(qǐng)求", URL, "的統(tǒng)計(jì)信息:")
 print(" 總請(qǐng)求數(shù) = %d,成功 = %d,失敗 = %d,異常 = %d" %(TOTAL, SUCC, FAIL, EXCEPT))
 print()
 print("往返程的估計(jì)時(shí)間(以毫秒為單位):")
 print(" 合計(jì) =", 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("響應(yīng)的狀態(tài)碼與次數(shù)信息(狀態(tài)碼:次數(shù)):")
 print(" ", CODE_MAP)
 print()
 print("輸出頁(yè)面請(qǐng)查看", RESULT_FILE, "文件(建議使用瀏覽器或XML專(zhuān)業(yè)工具打開(kāi))")
 print()
 # os.system("pause")

 print(TIME_LIST)
 input()

配置文件主要在于易于更改訪(fǎng)問(wèn)路徑等,其中SESSION_ID是在Fiddler中抓包獲取,配置文件源文件如下(為不泄露公司隱私,數(shù)據(jù)并非原始數(shù)據(jù),但格式相同):

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>

測(cè)試結(jié)果如下:

Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法

由于公司保密性要求,地址做了模糊處理,另外輸出的tradeWebResult.xml結(jié)果頁(yè)面也未展示。

以上僅為個(gè)人學(xué)習(xí)與使用Python過(guò)程的一個(gè)記錄,難免會(huì)有程序設(shè)計(jì)或使用不當(dāng),如有更好的意見(jiàn),歡迎指正。

注:此代碼開(kāi)發(fā)環(huán)境為Python 3.5 + windows,未在Python 2.x環(huán)境下測(cè)試

以上這篇Python 3.x基于Xml數(shù)據(jù)的Http請(qǐng)求方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何利用python執(zhí)行txt文件中的代碼

    如何利用python執(zhí)行txt文件中的代碼

    這篇文章主要介紹了如何利用python執(zhí)行txt文件中的代碼,python這么強(qiáng)大的語(yǔ)言當(dāng)然可以做大,只需使用內(nèi)置的exex()函數(shù),進(jìn)入主題前我們先來(lái)看看什么是exec()函數(shù),需要的小伙伴可以參考一下
    2022-03-03
  • python如何生成各種隨機(jī)分布圖

    python如何生成各種隨機(jī)分布圖

    這篇文章主要為大家詳細(xì)介紹了python如何生成各種隨機(jī)分布圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python開(kāi)發(fā)如何在ubuntu 15.10 上配置vim

    Python開(kāi)發(fā)如何在ubuntu 15.10 上配置vim

    這篇文章主要介紹了Python開(kāi)發(fā)如何在ubuntu 15.10 上配置vim 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Python:slice與indices的用法

    Python:slice與indices的用法

    今天小編就為大家分享一篇Python:slice與indices的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • 基于keras中import keras.backend as K的含義說(shuō)明

    基于keras中import keras.backend as K的含義說(shuō)明

    這篇文章主要介紹了keras中import keras.backend as K的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Numpy中Meshgrid函數(shù)基本用法及2種應(yīng)用場(chǎng)景

    Numpy中Meshgrid函數(shù)基本用法及2種應(yīng)用場(chǎng)景

    NumPy包含很多實(shí)用的數(shù)學(xué)函數(shù),涵蓋線(xiàn)性代數(shù)運(yùn)算、傅里葉變換和隨機(jī)數(shù)生成等功能,下面這篇文章主要給大家介紹了關(guān)于Numpy中Meshgrid函數(shù)基本用法及2種應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟

    用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟

    這篇文章主要介紹了用 Django 開(kāi)發(fā)一個(gè) Python Web API的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python/JS實(shí)現(xiàn)常見(jiàn)加密算法的示例代碼

    Python/JS實(shí)現(xiàn)常見(jiàn)加密算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了常見(jiàn)的一些JS加密,并記錄了JS和Python的實(shí)現(xiàn)方式,主要有base64編碼偽加密、MD5、SHAI等,需要的可以參考一下
    2022-11-11
  • 初步探究Python程序的執(zhí)行原理

    初步探究Python程序的執(zhí)行原理

    這篇文章主要介紹了Python程序的執(zhí)行原理,簡(jiǎn)要地描述了其中的步驟,需要的朋友可以參考下
    2015-04-04
  • logging level級(jí)別介紹

    logging level級(jí)別介紹

    今天小編就為大家分享一篇logging level級(jí)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02

最新評(píng)論