- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 3.x基于Xml数据的Http请求方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1. 前言 。
由于公司的一个项目是基于B/S架构与WEB服务通信,使用XML数据作为通信数据,在添加新功能时,WEB端与客户端分别由不同的部门负责,所以在WEB端功能实现过程中,需要自己发起请求测试,于是便选择了使用Python编写此脚本。另外由于此脚本最开始希望能在以后发展成具有压力测试的功能,所以除了基本的访问之外,添加了多线程请求.
整个脚本主要涉及到的关于Python的知识点包括:
基于urllib.request的Http访问 。
多线程 。
类与方法的定义 。
全局变量的定义与使用 。
文件的读取与写入 。
…… 。
2. 源码与结果 。
整个程序包括Python源码和配置文件,由于源码中有相应的注释,所以就直接贴源码吧,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
# 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中抓包获取,配置文件源文件如下(为不泄露公司隐私,数据并非原始数据,但格式相同):
1
2
3
4
5
6
7
8
9
10
|
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>
|
测试结果如下:
由于公司保密性要求,地址做了模糊处理,另外输出的tradeWebResult.xml结果页面也未展示.
以上仅为个人学习与使用Python过程的一个记录,难免会有程序设计或使用不当,如有更好的意见,欢迎指正.
注:此代码开发环境为Python 3.5 + windows,未在Python 2.x环境下测试 。
以上这篇Python 3.x基于Xml数据的Http请求方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/t894690230/article/details/50598718 。
最后此篇关于Python 3.x基于Xml数据的Http请求方法的文章就讲到这里了,如果你想了解更多关于Python 3.x基于Xml数据的Http请求方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!