基于PyQt5的HTTP接口测试工具开发实战

兆。 2024-12-11 10:16:08编程技术
113

随着互联网技术的快速发展,HTTP接口测试成为了软件开发和测试过程中的重要环节。为了提高测试效率和准确性,开发一个用户友好的HTTP接口测试工具显得尤为重要。本文将介绍如何使用Python和PyQt5框架开发一个简单的HTTP接口测试工具。该工具不仅支持GET和POST两种请求方法,还允许用户自定义请求头,并能详细显示请求和响应的信息,帮助开发者快速定位和解决问题。

项目背景

随着互联网的发展,各种 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。

基于PyQt5的HTTP接口测试工具开发实战

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

基于PyQt5的HTTP接口测试工具开发实战

当我们把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

总结

本文详细介绍了如何使用Python和PyQt5开发一个功能齐全的HTTP接口测试工具。通过组合框选择请求方法、输入URL、设置请求头等操作,用户可以轻松发送HTTP请求,并查看详细的请求和响应信息。该工具不仅界面友好,操作简便,还具有良好的异常处理机制,能够有效帮助开发者进行接口测试和调试。通过本文的介绍,读者可以了解到如何结合Python和PyQt5实现一个实用的HTTP接口测试工具,从而提升开发和测试效率。

PyQt5 http接口测试工具 Python
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

使用Python和PyQt5打造多功能PDF转换器
本文将介绍如何使用Python和PyQt5构建一个多功能PDF转换器,帮助用户轻松实现PDF文件的各种转换操作。通过本文的学习,读者将掌握如何利用Python编程语言和PyQt5图形用户界面...
2024-12-26 编程技术
104

Python中生成随机整数的利器:numpy.random.randint()函数详解
在数据科学和机器学习领域,生成随机数是常见的需求之一。Python的NumPy库提供了强大的工具来生成各种类型的随机数。本文将详细介绍numpy.random.randint()函数,该函数可以生...
2024-12-24 编程技术
116

Python实现将Word转PDF的两种方法详解(附示例代码)
在日常工作和学习中,我们经常需要将Word文档转换为PDF格式,以便于分享、归档或打印。手动逐个转换不仅耗时费力,而且容易出错。幸运的是,Python提供了一些强大的库,可以帮...
2024-12-22 编程技术
111

Python中lambda表达式的使用方法详解
在Python中,lambda表达式是一种简洁的匿名函数定义方式,广泛应用于各种编程场景中。本文将详细介绍Python中lambda表达式的使用方法,帮助读者更好地理解和掌握这一强大的工...
2024-12-22 编程技术
112

使用Python和Tkinter的开发股票交易计算器
​在当今的金融市场中,股票交易是一项复杂且需要精确计算的活动。为了帮助投资者更好地管理他们的交易成本和收益,本文介绍了一个使用Python和Tkinter库开发的股票交易计算器...
2024-12-21 编程技术
112

Python实现批量将图片转为PDF文件的示例代码
在日常工作中,我们经常需要将多张图片转换为PDF文件,以便于分享和存档。手动操作不仅耗时,而且容易出错。幸运的是,Python 提供了强大的库,如Pillow和PyPDF2,可以帮助我...
2024-12-21 编程技术
116