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 方法的代码,负责构建用户界面:

python 复制代码
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方法:

python 复制代码
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填充之后,就可以正常访问网址了

完整代码

python 复制代码
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 库,可以通过以下命令安装:

python 复制代码
pip install PyQt5 requests

总结

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

相关推荐
PieroPc6 分钟前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
梧桐树04294 小时前
python常用内建模块:collections
python
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
mahuifa5 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
蓝天星空5 小时前
Python调用open ai接口
人工智能·python
jasmine s6 小时前
Pandas
开发语言·python
郭wes代码6 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf6 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零16 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志