Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具
項(xiàng)目背景
隨著互聯(lián)網(wǎng)的發(fā)展,各種 API(應(yīng)用程序編程接口)的使用日益廣泛。無論是在構(gòu)建前端和后端應(yīng)用,還是在進(jìn)行數(shù)據(jù)分析和集成時(shí),測(cè)試 API 的能力都是基礎(chǔ)技能之一。我們將用 PyQt5 創(chuàng)建一個(gè)簡(jiǎn)單的工具,允許用戶輸入請(qǐng)求 URL 和請(qǐng)求頭,并能夠選擇請(qǐng)求方式(GET 或 POST),以查看返回結(jié)果。
具體的效果可以看看這個(gè)視頻給你們的一個(gè)練習(xí)
技術(shù)棧
Python:作為主要編程語言。
PyQt5:用于創(chuàng)建圖形用戶界面。
Requests:用于發(fā)送 HTTP 請(qǐng)求。
用戶界面
我們將創(chuàng)建一個(gè)簡(jiǎn)單的用戶界面,包含以下組件:
- URL 輸入框
- 請(qǐng)求方式下拉框(GET/POST)
- 請(qǐng)求頭設(shè)置表格(可以增加和刪除行)
- 發(fā)送請(qǐng)求的按鈕
- 顯示信息的區(qū)域(包括請(qǐng)求和響應(yīng)的詳細(xì)信息)
以下是 setupUi 方法的代碼,負(fù)責(zé)構(gòu)建用戶界面:
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(900, 600)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
# 添加 ComboBox 選擇請(qǐng)求方式
self.comboBox = QtWidgets.QComboBox(Form)
self.comboBox.addItem("GET")
self.comboBox.addItem("POST")
# 添加 LineEdit 輸入 URL
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setPlaceholderText("此處填寫url")
# 按鈕用于發(fā)送請(qǐng)求
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setText("發(fā)送")
# 請(qǐng)求頭展示的表格
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)核心功能實(shí)現(xiàn)
用戶點(diǎn)擊“發(fā)送”按鈕后,將會(huì)根據(jù)輸入的 URL 和請(qǐng)求頭發(fā)送請(qǐng)求。下列是處理請(qǐng)求的 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('請(qǐng)求失敗: ' + str(e))
return
??????? self.ui.listWidget.addItem(f'狀態(tài)碼:{rt.status_code}')
for key, value in rt.headers.items():
self.ui.listWidget.addItem(f'{key}: {value}')結(jié)果展示
在信息框中,會(huì)顯示請(qǐng)求的 URL、請(qǐng)求頭信息及其響應(yīng)狀態(tài)碼。這種實(shí)時(shí)反饋可以幫助開發(fā)者快速調(diào)試 API。

如上圖所示,在只填寫url的情況下,發(fā)現(xiàn)狀態(tài)碼是412訪問失敗

當(dāng)我們把useragent填充之后,就可以正常訪問網(wǎng)址了
完整代碼
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接口測(cè)試"))
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", "發(fā)送"))
self.label.setText(_translate("Form", "請(qǐng)求頭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)
# 邏輯函數(shù)
class Mywindow(QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form() # 實(shí)例化ui界面
self.ui.setupUi(self)
self.clicked_row = 0 # 默認(rèn)用戶選擇的是第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('--------發(fā)送請(qǐng)求---------')
self.ui.listWidget.addItem(f'用戶要訪問的網(wǎng)址是:{input_url}')
self.ui.listWidget.addItem(f'用戶訪問對(duì)網(wǎng)址的請(qǐng)求方式是:{send_made}')
self.ui.listWidget.addItem('請(qǐng)求頭如下:')
data_dict = {}
# 獲取行數(shù)
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出錯(cuò)')
rt = 404
self.ui.listWidget.addItem('--------返回內(nèi)容---------')
self.ui.listWidget.addItem(f'狀態(tài)碼:{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('點(diǎn)擊了清理')
self.ui.listWidget.clear()
self.info_text = []
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Mywindow()
window.show()
sys.exit(app.exec_())
完整的代碼已經(jīng)在前面展示。確保已經(jīng)安裝 PyQt5 和 requests 庫,可以通過以下命令安裝:
pip install PyQt5 requests
總結(jié)
本項(xiàng)目展示了如何用 PyQt5 來構(gòu)建 GUI 應(yīng)用程序,并通過 requests 庫發(fā)送 HTTP 請(qǐng)求。這不僅是學(xué)習(xí) PyQt5 的一個(gè)好方法,也為后續(xù)實(shí)現(xiàn)更復(fù)雜的 API 測(cè)試工具奠定了基礎(chǔ)。
到此這篇關(guān)于Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具的文章就介紹到這了,更多相關(guān)Python HTTP接口測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3隨機(jī)漫步生成數(shù)據(jù)并繪制
這篇文章主要為大家詳細(xì)介紹了Python3隨機(jī)漫步生成數(shù)據(jù)并繪制的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
python3讀取autocad圖形文件.py實(shí)例
這篇文章主要介紹了python3讀取autocad圖形文件.py實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python callable()函數(shù)用法實(shí)例分析
這篇文章主要介紹了Python callable()函數(shù)用法,結(jié)合實(shí)例形式分析了Python callable()函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03

