Python实战之使用PyQt5构建HTTP接口测试工具

 更新时间:2024年11月18日 11:19:40   作者:兆。  
在现代软件开发中,测试接口的有效性与响应情况变得尤为重要,本文将指导构建一个简单的HTTP接口测试工具,使用Python的PyQt5库创建用户界面,并通过requests库发送 HTTP 请求,需要的可以参考下

项目背景

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

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

技术栈

Python:作为主要编程语言。

PyQt5:用于创建图形用户界面。

Requests:用于发送 HTTP 请求。

用户界面

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

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

以下是 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 输入 URL
    self.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] = value
    
    try:
        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))
        return

​​​​​​​    self.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, QtWidgets

class 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.translate
        Form.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 = row

    def 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_dict

        try:
            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 = 404
        self.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 测试工具奠定了基础。

到此这篇关于Python实战之使用PyQt5构建HTTP接口测试工具的文章就介绍到这了,更多相关Python HTTP接口测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • numpy.linspace函数具体使用详解

    numpy.linspace函数具体使用详解

    这篇文章主要介绍了numpy.linspace具体使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Python实现遍历大量表格文件并筛选出数据缺失率低的文件

    Python实现遍历大量表格文件并筛选出数据缺失率低的文件

    这篇文章主要为大家详细介绍了如何利用Python实现遍历大量表格文件并筛选出表格内数据缺失率低的文件的功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • python如何寻找主串中所有指定子串下标

    python如何寻找主串中所有指定子串下标

    这篇文章主要介绍了python如何寻找主串中所有指定子串下标,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Pandas中Series和DataFrame的索引实现

    Pandas中Series和DataFrame的索引实现

    这篇文章主要介绍了Pandas中Series和DataFrame的索引实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python文件打包工具一站式指南

    Python文件打包工具一站式指南

    这篇文章主要为大家介绍了Python文件打包工具一站式指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python+Pygame制作简易版2048小游戏

    Python+Pygame制作简易版2048小游戏

    2048作为经典的手机端游戏一直深受大家的喜爱,本文将利用Python中的Pygame模块制作简单版的2048游戏,感兴趣的小伙伴可以了解一下
    2022-02-02
  • 如何利用python写GUI及生成.exe可执行文件

    如何利用python写GUI及生成.exe可执行文件

    工作中需要开发一个小工具,简单的UI界面可以很好的提高工具的实用性,由此开启了我的第一次GUI开发之旅,这篇文章主要给大家介绍了关于如何利用python写GUI及生成.exe可执行文件的相关资料,需要的朋友可以参考下
    2021-12-12
  • python中的subprocess.Popen()使用详解

    python中的subprocess.Popen()使用详解

    今天小编就为大家分享一篇python中的subprocess.Popen()使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python使用multiprocessing模块实现带回调函数的异步调用方法

    python使用multiprocessing模块实现带回调函数的异步调用方法

    这篇文章主要介绍了python使用multiprocessing模块实现带回调函数的异步调用方法,实例分析了multiprocessing模块异步调用的相关使用技巧,需要的朋友可以参考下
    2015-04-04
  • python3通过udp实现组播数据的发送和接收操作

    python3通过udp实现组播数据的发送和接收操作

    这篇文章主要介绍了python3通过udp实现组播数据的发送和接收操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05

最新评论