python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

文章目录

  • python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具
  • 项目背景
  • 技术栈
  • 用户界面
  • 核心功能实现
  • 结果展示
  • 完整代码
  • 总结

在现代软件开发中,测试接口的有效性与响应情况变得尤为重要。本文将指导构建一个简单的 HTTP 接口测试工具,使用 Python 的 PyQt5 库创建用户界面,并通过 requests 库发送 HTTP 请求。

项目背景

随着互联网的发展,各种 API(应用程序编程接口)的使用日益广泛。无论是在构建前端和后端应用,还是在进行数据分析和集成时,测试 API 的能力都是基础技能之一。我们将用 PyQt5 创建一个简单的工具,允许用户输入请求 URL 和请求头,并能够选择请求方式(GET 或 POST),以查看返回结果。

具体的效果可以看看这个视频给你们的一个练习_哔哩哔哩_bilibili

技术栈

  • Python:作为主要编程语言。
  • PyQt5:用于创建图形用户界面。
  • Requests:用于发送 HTTP 请求。

用户界面

我们将创建一个简单的用户界面,包含以下组件:

  1. URL 输入框
  2. 请求方式下拉框(GET/POST)
  3. 请求头设置表格(可以增加和删除行)
  4. 发送请求的按钮
  5. 显示信息的区域(包括请求和响应的详细信息)

以下是 setupUi 方法的代码,负责构建用户界面:

def setupUi(self, Form):Form.setObjectName("Form")Form.resize(900, 600)self.verticalLayout = QtWidgets.QVBoxLayout(Form)# 添加 ComboBox 选择请求方式self.comboBox = QtWidgets.QComboBox(Form)self.comboBox.addItem("GET")self.comboBox.addItem("POST")# 添加 LineEdit 输入 URLself.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setPlaceholderText("此处填写url")# 按钮用于发送请求self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setText("发送")# 请求头展示的表格self.tableWidget = QtWidgets.QTableWidget(Form)self.tableWidget.setColumnCount(2)self.tableWidget.setHorizontalHeaderLabels(["名称", "值"])# 信息框self.listWidget = QtWidgets.QListWidget(Form)# 组件布局self.verticalLayout.addWidget(self.comboBox)self.verticalLayout.addWidget(self.lineEdit)self.verticalLayout.addWidget(self.pushButton)self.verticalLayout.addWidget(self.tableWidget)self.verticalLayout.addWidget(self.listWidget)

核心功能实现

用户点击“发送”按钮后,将会根据输入的 URL 和请求头发送请求。下列是处理请求的 send_clicked方法:

def send_clicked(self):input_url = self.ui.lineEdit.text()send_made = self.ui.comboBox.currentText()data_dict = {}row_count = self.ui.tableWidget.rowCount()for row in range(row_count):key = self.ui.tableWidget.item(row, 0).text()value = self.ui.tableWidget.item(row, 1).text()data_dict[key] = valuetry:if send_made == 'GET':rt = requests.get(url=input_url, headers=data_dict)else:rt = requests.post(url=input_url, headers=data_dict)except Exception as e:self.ui.listWidget.addItem('请求失败: ' + str(e))returnself.ui.listWidget.addItem(f'状态码:{rt.status_code}')for key, value in rt.headers.items():self.ui.listWidget.addItem(f'{key}: {value}')

结果展示

在信息框中,会显示请求的 URL、请求头信息及其响应状态码。这种实时反馈可以帮助开发者快速调试 API。

请添加图片描述

如上图所示,在只填写url的情况下,发现状态码是412访问失败

请添加图片描述

当我们把useragent填充之后,就可以正常访问网址了

完整代码

import sys
import requests
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(900, 600)self.verticalLayout = QtWidgets.QVBoxLayout(Form)self.verticalLayout.setObjectName("verticalLayout")self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.comboBox = QtWidgets.QComboBox(Form)self.comboBox.setObjectName("comboBox")self.comboBox.addItem("")self.comboBox.addItem("")self.horizontalLayout.addWidget(self.comboBox)self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setObjectName("lineEdit")self.horizontalLayout.addWidget(self.lineEdit)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setObjectName("pushButton")self.horizontalLayout.addWidget(self.pushButton)self.verticalLayout.addLayout(self.horizontalLayout)self.horizontalLayout_2 = QtWidgets.QHBoxLayout()self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.label = QtWidgets.QLabel(Form)self.label.setObjectName("label")self.horizontalLayout_2.addWidget(self.label)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_2.addItem(spacerItem)self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setObjectName("pushButton_2")self.horizontalLayout_2.addWidget(self.pushButton_2)self.pushButton_3 = QtWidgets.QPushButton(Form)self.pushButton_3.setObjectName("pushButton_3")self.horizontalLayout_2.addWidget(self.pushButton_3)self.verticalLayout.addLayout(self.horizontalLayout_2)self.tableWidget = QtWidgets.QTableWidget(Form)self.tableWidget.setObjectName("tableWidget")self.tableWidget.setColumnCount(2)self.tableWidget.setRowCount(0)item = QtWidgets.QTableWidgetItem()self.tableWidget.setHorizontalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()self.tableWidget.setHorizontalHeaderItem(1, item)self.verticalLayout.addWidget(self.tableWidget)self.label_2 = QtWidgets.QLabel(Form)font = QtGui.QFont()font.setBold(True)font.setWeight(75)self.label_2.setFont(font)self.label_2.setObjectName("label_2")self.verticalLayout.addWidget(self.label_2)self.listWidget = QtWidgets.QListWidget(Form)self.listWidget.setObjectName("listWidget")self.verticalLayout.addWidget(self.listWidget)self.horizontalLayout_3 = QtWidgets.QHBoxLayout()self.horizontalLayout_3.setObjectName("horizontalLayout_3")spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_3.addItem(spacerItem1)self.pushButton_4 = QtWidgets.QPushButton(Form)font = QtGui.QFont()font.setBold(True)font.setWeight(75)self.pushButton_4.setFont(font)self.pushButton_4.setObjectName("pushButton_4")self.horizontalLayout_3.addWidget(self.pushButton_4)spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_3.addItem(spacerItem2)self.verticalLayout.addLayout(self.horizontalLayout_3)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "HTTP接口测试"))self.comboBox.setItemText(0, _translate("Form", "GET"))self.comboBox.setItemText(1, _translate("Form", "POST"))self.lineEdit.setPlaceholderText(_translate("Form", "此处填写url"))self.pushButton.setText(_translate("Form", "发送"))self.label.setText(_translate("Form", "请求头headers"))self.pushButton_2.setText(_translate("Form", "+"))self.pushButton_3.setText(_translate("Form", "-"))item = self.tableWidget.horizontalHeaderItem(0)item.setText(_translate("Form", "名称"))item = self.tableWidget.horizontalHeaderItem(1)item.setText(_translate("Form", "值"))self.label_2.setText(_translate("Form", "信息框"))self.pushButton_4.setText(_translate("Form", "清空"))# 绑定按钮self.pushButton.clicked.connect(Form.send_clicked)self.pushButton_2.clicked.connect(Form.add_row)self.pushButton_3.clicked.connect(Form.move_row)self.tableWidget.cellClicked.connect(Form.table_clicked)self.pushButton_4.clicked.connect(Form.clean_panel)# 逻辑函数
class Mywindow(QWidget):def __init__(self):super().__init__()self.ui = Ui_Form() # 实例化ui界面self.ui.setupUi(self)self.clicked_row = 0 # 默认用户选择的是第0行self.info_text = []def table_clicked(self,row):self.clicked_row = rowdef send_clicked(self):self.clean_panel()input_url = self.ui.lineEdit.text()send_made = self.ui.comboBox.currentText()# 展示信息在面板上self.ui.listWidget.addItem('--------发送请求---------')self.ui.listWidget.addItem(f'用户要访问的网址是:{input_url}')self.ui.listWidget.addItem(f'用户访问对网址的请求方式是:{send_made}')self.ui.listWidget.addItem('请求头如下:')data_dict = {}# 获取行数row_count = self.ui.tableWidget.rowCount()# 遍历每一行for row in range(0,row_count):key = self.ui.tableWidget.item(row, 0).text()value = self.ui.tableWidget.item(row, 1).text()dict1={f'{key}':f'{value}'}self.ui.listWidget.addItem(str(dict1))data_dict = dict1|data_dicttry:if send_made=='GET':rt = requests.get(url=input_url,headers=data_dict)else:rt = requests.post(url=input_url,headers=data_dict)except:self.ui.listWidget.addItem('url出错')rt = 404self.ui.listWidget.addItem('--------返回内容---------')self.ui.listWidget.addItem(f'状态码:{rt}')if not rt == 404:for key,value in rt.headers.items():self.ui.listWidget.addItem(f'{key}  :  {value}')def add_row(self):self.ui.tableWidget.insertRow(self.ui.tableWidget.rowCount())def move_row(self):self.ui.tableWidget.removeRow(self.clicked_row)self.clicked_row = 0  # 把删除行置零def clean_panel(self):print('点击了清理')self.ui.listWidget.clear()self.info_text = []if __name__ == '__main__':app = QApplication(sys.argv)window = Mywindow()window.show()sys.exit(app.exec_())

完整的代码已经在前面展示。确保已经安装 PyQt5 和 requests 库,可以通过以下命令安装:

pip install PyQt5 requests

总结

本项目展示了如何用 PyQt5 来构建 GUI 应用程序,并通过 requests 库发送 HTTP 请求。这不仅是学习 PyQt5 的一个好方法,也为后续实现更复杂的 API 测试工具奠定了基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475727.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之信息收集-实战-1

请注意,本文仅供合法和授权的渗透测试使用,任何未经授权的活动都是违法的。 实战:补天公益src“吉林通用航空职业技术学院” 奇安信|用户登录https://www.butian.net/Loo/submit?cid64918 域名或ip:https://www.jlth…

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战,先创建项目“ImplicitWantStartAbility”,接着修改In…

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备,凭借其便携性…

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境,它在现代 JavaScript 开发中扮演着重要角色。然而,许多开发者在使用 Node.js 时常常会感到困惑,尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异,帮助你全面理解两者的设计…

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备,进行在线命令调试,也可配合ftp或ssh使用。 telnet某些库在qt5下不可用,无法获取登录信息,只能获取到连接信息,这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务,并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码:小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

Hbuilder X/Uniapp 关于app运行调试及mumu模拟器运行问题

Hbuilder X 关于app调试问题及mumu模拟器链接问题 Hbuilder 关于app调试问题1. app运行配置2. adb路径配置3. 模拟器端口查询4. 运行 Hbuilder 关于app调试问题 1. app运行配置 Hbuilder > 工具 > 设置 > 运行配置 adb路径配置(见2) Android模…

MySQL-关键字执行顺序

&#x1f496;简介 在MySQL中&#xff0c;SQL查询语句的执行遵循一定的逻辑顺序&#xff0c;即使这些关键字在SQL语句中的物理排列可能有所不同。 &#x1f31f;语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 Enterprise Architect 16 简介&#xff08;一&#xff09;支持多种建模语言和标准&#xff08;二&#xff09;强大的版本控制、协作和文档管理功能&#xff08;三&#xff09;增强的技术和用户体验&#xff08;四&#xff09;高级功能和扩展性 一&#xff0c;下载软件…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

JVM--内存结构

目录 1. PC Register&#xff08;程序计数器&#xff09; 1.1 定义 1.2 工作原理 1.3 特点 1.4 应用 2.虚拟机栈 2.1定义与特性 2.2内存模型 2.3工作原理 2.4异常处理 2.5应用场景 2.6 Slot 复用 2.7 动态链接详解 1. 栈帧与动态链接 动态链接的作用&#xff1a…

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍 本文分为两个部分&#xff0c;第一是详细讲解Redis6的--bigkeys选项相关源码是怎样实现的&#xff0c;第二部分为自己对--bigkeys源码的优化项目redis-bigkey-online的介绍。redis-bigkey-online是自己开发的…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为TS文件呢&#xff1f;它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

C++初阶学习第十一弹——list的用法和模拟实现

目录 一、list的使用 二.list的模拟实现 三.总结 一、list的使用 list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。 常见的list的函数的使用 std::list<int> It {1,…

Qlik Sense QVD 文件

QVD 文件 QVD (QlikView Data) 文件是包含从 Qlik Sense 或 QlikView 中所导出数据的表格的文件。QVD 是本地 Qlik 格式&#xff0c;只能由 Qlik Sense 或 QlikView 写入和读取。当从 Qlik Sense 脚本中读取数据时&#xff0c;该文件格式可提升速度&#xff0c;同时又非常紧凑…

攻防世界 Web新手练习区

GFSJ0475 get_post 获取在线场景后&#xff0c;点开网址 依据提示在搜索框输入信息 给出第二条提示信息 打开hackbar&#xff0c;将网址Load下来&#xff0c;勾选Post data&#xff0c;在下方输入框输入b2 点击Execute 出现flag值 GFSJ0476 robots 打开御剑扫描域名&#…