当前位置: 代码网 > it编程>前端脚本>Python > Python实战之使用PyQt5构建HTTP接口测试工具

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

2024年11月19日 Python 我要评论
项目背景随着互联网的发展,各种 api(应用程序编程接口)的使用日益广泛。无论是在构建前端和后端应用,还是在进行数据分析和集成时,测试 api 的能力都是基础技能之一。我们将用 pyqt5 创建一个简

项目背景

随着互联网的发展,各种 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接口测试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com