最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具

 更新時(shí)間:2024年11月18日 11:19:40   作者:兆。  
在現(xiàn)代軟件開發(fā)中,測(cè)試接口的有效性與響應(yīng)情況變得尤為重要,本文將指導(dǎo)構(gòu)建一個(gè)簡(jiǎn)單的HTTP接口測(cè)試工具,使用Python的PyQt5庫(kù)創(chuàng)建用戶界面,并通過(guò)requests庫(kù)發(fā)送 HTTP 請(qǐng)求,需要的可以參考下

項(xiàng)目背景

隨著互聯(lián)網(wǎng)的發(fā)展,各種 API(應(yīng)用程序編程接口)的使用日益廣泛。無(wú)論是在構(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:作為主要編程語(yǔ)言。

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訪問(wèn)失敗

當(dāng)我們把useragent填充之后,就可以正常訪問(wèn)網(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èn)的網(wǎng)址是:{input_url}')
        self.ui.listWidget.addItem(f'用戶訪問(wèn)對(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 庫(kù),可以通過(guò)以下命令安裝:

pip install PyQt5 requests

總結(jié)

本項(xiàng)目展示了如何用 PyQt5 來(lái)構(gòu)建 GUI 應(yīng)用程序,并通過(guò) requests 庫(kù)發(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)文章

  • python中的*和**做參數(shù)的用法詳解

    python中的*和**做參數(shù)的用法詳解

    python的方法的參數(shù)除了可以使用標(biāo)識(shí)符,還可以使用*和**作為參數(shù),這些符號(hào)在Python中常用于處理可變數(shù)量的參數(shù),本文給大家介紹python *和**做參數(shù)的用法,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 使用Python在Windows下獲取USB PID&VID的方法

    使用Python在Windows下獲取USB PID&VID的方法

    今天小編就為大家分享一篇使用Python在Windows下獲取USB PID&VID的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 使用Python編寫提取日志中的中文的腳本的方法

    使用Python編寫提取日志中的中文的腳本的方法

    這篇文章主要介紹了使用Python編寫提取日志中的中文的腳本的方法,該腳本包括過(guò)濾重復(fù)的字符行等功能,需要的朋友可以參考下
    2015-04-04
  • Python結(jié)合SQLite構(gòu)建一個(gè)完整數(shù)據(jù)驅(qū)動(dòng)應(yīng)用的終極指南

    Python結(jié)合SQLite構(gòu)建一個(gè)完整數(shù)據(jù)驅(qū)動(dòng)應(yīng)用的終極指南

    這篇文章主要為大家詳細(xì)介紹了Python結(jié)合SQLite構(gòu)建一個(gè)完整數(shù)據(jù)驅(qū)動(dòng)應(yīng)用的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-01-01
  • Python OpenCV對(duì)圖像進(jìn)行模糊處理詳解流程

    Python OpenCV對(duì)圖像進(jìn)行模糊處理詳解流程

    OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面很多通用算法
    2021-10-10
  • python 實(shí)現(xiàn)保存最新的三份文件,其余的都刪掉

    python 實(shí)現(xiàn)保存最新的三份文件,其余的都刪掉

    今天小編就為大家分享一篇python 實(shí)現(xiàn)保存最新的三份文件,其余的都刪掉,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 使用pyqt 實(shí)現(xiàn)重復(fù)打開多個(gè)相同界面

    使用pyqt 實(shí)現(xiàn)重復(fù)打開多個(gè)相同界面

    今天小編就為大家分享一篇使用pyqt 實(shí)現(xiàn)重復(fù)打開多個(gè)相同界面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • pytorch 禁止/允許計(jì)算局部梯度的操作

    pytorch 禁止/允許計(jì)算局部梯度的操作

    這篇文章主要介紹了pytorch 禁止/允許計(jì)算局部梯度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • python變量前面加星(*)的含義及說(shuō)明

    python變量前面加星(*)的含義及說(shuō)明

    這篇文章主要介紹了python變量前面加星(*)的含義及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python TestSuite生成測(cè)試報(bào)告過(guò)程解析

    Python TestSuite生成測(cè)試報(bào)告過(guò)程解析

    這篇文章主要介紹了Python TestSuite生成測(cè)試報(bào)告過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

图木舒克市| 诸暨市| 利川市| 湘潭县| 三都| 眉山市| 汾阳市| 于都县| 绵竹市| 蓝田县| 额敏县| 白水县| 将乐县| 会昌县| 延寿县| 洞头县| 固镇县| 遂昌县| 孟州市| 永安市| 古交市| 阿拉尔市| 台东市| 建德市| 河北省| 临夏县| 库车县| 高密市| 昔阳县| 乐都县| 松溪县| 高陵县| 临海市| 青神县| 林口县| 合川市| 滁州市| 华蓥市| 精河县| 凤城市| 新余市|