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