PySide6 - HTTP接口测试器

参考链接:https://blog.csdn.net/a597934448/article/details/118110839

界面设计

打开 Qt designer 设计如下界面,保存为 httpclient.ui
在这里插入图片描述

代码实现

  • requests库的使用
  • QTableWidget 类的方法使用currentRow()、insertRow、removeRow
  • QTextEdit类的 append() 方法

这里主要借鉴了参考文章的请求头和响应头的打印处理方法,有点意思,我还以为requests真有现成的属性呢

from PySide.QtWidgets import QApplication
from PySide.QtUiTools import QUiLoader
from PySide.QtCore import QObject
from PySide.QtGui import  QIcon

import traceback
import requests

class HttpClient(QObject):
    def __init__(self):
        QObject.__init__(self)
        # 从 UI 定义中动态 创建一个相应的窗口对象
        self.ui = QUiLoader().load('httpclient.ui')

        # 给 boxMethod 添加选项 GET POST PUT DELETE
        self.ui.boxMethod.addItems(['GET', 'POST', 'PUT', 'DELETE'])

        # 让 表格控件宽度随着父窗口的缩放自动缩放
        self.ui.headersTable.horizontalHeader().setStretchLastSection(True)
        # 设定第1列的宽度为 180像素
        self.ui.headersTable.setColumnWidth(0, 180)

		# 槽函数
        self.ui.buttonSend.clicked.connect(self.sendRequest)
        self.ui.buttonAddHeader.clicked.connect(self.addOneHeader)
        self.ui.buttonDelHeader.clicked.connect(self.delOneHeader)


    def addOneHeader(self):

        # rowCount = self.ui.headersTable.rowCount()
        # 要插入的行始终是当前行 的下一行
        addRowNumber = self.ui.headersTable.currentRow() + 1
        self.ui.headersTable.insertRow(addRowNumber)

    def delOneHeader(self):

        self.ui.headersTable.removeRow(
            self.ui.headersTable.currentRow()
        )

    def sendRequest(self):

        method = self.ui.boxMethod.currentText()
        url    = self.ui.editUrl.text()
        payload = self.ui.editBody.toPlainText()

        # 获取消息头
        headers = {
    
    }
        ht = self.ui.headersTable
        for row in range(ht.rowCount()):
            k = ht.item(row,0).text()
            v = ht.item(row,1).text()
            if k.strip() == '':
                continue
            headers[k] = v

        req = requests.Request(method,
                               url,
                               headers=headers,
                               data=payload
                               )

        prepared = req.prepare()

        self.pretty_print_request(prepared)
        s = requests.Session()

        try:
            r = s.send(prepared)
            self.pretty_print_response(r)
        except:
            self.ui.outputWindow.append(
                traceback.format_exc())


    def pretty_print_request(self,req):

        if req.body == None:
            msgBody = ''
        else:
            msgBody = req.body

        self.ui.outputWindow.append(
            '{}\n{}\n{}\n\n{}'.format(
            '\n\n----------- 发送请求 -----------',
            req.method + ' ' + req.url,
            '\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
            msgBody,
        ))

    def pretty_print_response(self,res):
        self.ui.outputWindow.append(
            '{}\nHTTP/1.1 {}\n{}\n\n{}'.format(
            '\n\n----------- 得到响应 -----------',
            res.status_code,
            '\n'.join('{}: {}'.format(k, v) for k, v in res.headers.items()),
            res.text,
        ))

app = QApplication([])
# 加载 icon
app.setWindowIcon(QIcon('logo.png'))
httpClient = HttpClient()
httpClient.ui.show()
app.exec_()

猜你喜欢

转载自blog.csdn.net/m0_52062236/article/details/128160126