Python實戰(zhàn)之使用PyQt5構建HTTP接口測試工具
項目背景
隨著互聯(lián)網(wǎng)的發(fā)展,各種 API(應用程序編程接口)的使用日益廣泛。無論是在構建前端和后端應用,還是在進行數(shù)據(jù)分析和集成時,測試 API 的能力都是基礎技能之一。我們將用 PyQt5 創(chuàng)建一個簡單的工具,允許用戶輸入請求 URL 和請求頭,并能夠選擇請求方式(GET 或 POST),以查看返回結果。
具體的效果可以看看這個視頻給你們的一個練習
技術棧
Python:作為主要編程語言。
PyQt5:用于創(chuàng)建圖形用戶界面。
Requests:用于發(fā)送 HTTP 請求。
用戶界面
我們將創(chuàng)建一個簡單的用戶界面,包含以下組件:
- URL 輸入框
- 請求方式下拉框(GET/POST)
- 請求頭設置表格(可以增加和刪除行)
- 發(fā)送請求的按鈕
- 顯示信息的區(qū)域(包括請求和響應的詳細信息)
以下是 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") # 按鈕用于發(fā)送請求 self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setText("發(fā)送") # 請求頭展示的表格 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)
核心功能實現(xiàn)
用戶點擊“發(fā)送”按鈕后,將會根據(jù)輸入的 URL 和請求頭發(fā)送請求。下列是處理請求的 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'狀態(tài)碼:{rt.status_code}') for key, value in rt.headers.items(): self.ui.listWidget.addItem(f'{key}: {value}')
結果展示
在信息框中,會顯示請求的 URL、請求頭信息及其響應狀態(tài)碼。這種實時反饋可以幫助開發(fā)者快速調試 API。
如上圖所示,在只填寫url的情況下,發(fā)現(xiàn)狀態(tài)碼是412訪問失敗
當我們把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接口測試")) 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", "請求頭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() # 實例化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('--------發(fā)送請求---------') self.ui.listWidget.addItem(f'用戶要訪問的網(wǎng)址是:{input_url}') self.ui.listWidget.addItem(f'用戶訪問對網(wǎng)址的請求方式是:{send_made}') self.ui.listWidget.addItem('請求頭如下:') 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出錯') rt = 404 self.ui.listWidget.addItem('--------返回內容---------') 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('點擊了清理') 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
總結
本項目展示了如何用 PyQt5 來構建 GUI 應用程序,并通過 requests 庫發(fā)送 HTTP 請求。這不僅是學習 PyQt5 的一個好方法,也為后續(xù)實現(xiàn)更復雜的 API 測試工具奠定了基礎。
到此這篇關于Python實戰(zhàn)之使用PyQt5構建HTTP接口測試工具的文章就介紹到這了,更多相關Python HTTP接口測試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python callable()函數(shù)用法實例分析
這篇文章主要介紹了Python callable()函數(shù)用法,結合實例形式分析了Python callable()函數(shù)的功能、使用方法及相關操作注意事項,需要的朋友可以參考下2018-03-03