自学内容网 自学内容网

[白月黑羽]关于仿写类postman功能软件题目的解答

原题:
在这里插入图片描述
答:
python文件如下

from PySide6.QtWidgets import QApplication, QMessageBox,QTableWidgetItem,QHeaderView,QWidget,QTableWidget
from PySide6.QtCore import QEvent,QObject
from PySide6.QtUiTools import QUiLoader
import time
import requests

uiLoader = QUiLoader()

class TableWidgetFilter(QObject):
    def __init__(self, parent=None):
        super(TableWidgetFilter, self).__init__(parent)
    
    def eventFilter(self, watched, event):
        if event.type() == QEvent.MouseButtonRelease:
            idx = watched.parentWidget().indexAt(event.position().toPoint())
            if(idx.row() < 0):
                watched.parentWidget().setCurrentItem(None)
        return super(TableWidgetFilter, self).eventFilter( watched, event)

# 用于打印请求消息, 参数为 PreparedRequest 对象
def pretty_print_request(req):
    if req.body == None:
        msgBody = ''
    else:
        msgBody = req.body
    
    # 打印请求消息,如果为空不拼接进去
    result = '\n----------- 发送请求 -----------'
    if req.method!= None and req.url!= None:
        result = result + '\n' + req.method + ' ' + req.url 
    if req.headers != None and len(req.headers) > 0:
        result = result +  '\n' 
        result = result + str('\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()))
    if msgBody!= '':
        result = result + str('\n' + msgBody)
    return result

# 用于打印响应消息
def pretty_print_response(res) -> str:
    result = '\n----------- 得到响应 -----------'
    if res.status_code!= None:
        result = result + str('\nHTTP/1.1 '+ str(res.status_code))
    if res.headers!= None and len(res.headers) > 0:
        result = result + '\n' 
        result = result + str('\n'.join('{}: {}'.format(k, v) for k, v in res.headers.items()))
    if res.text!= '':
        result = result + str('\n' + res.text)
    return result


class MainWindow:
    def __init__(self):
        self.ui = uiLoader.load('.\\main.ui')

        self.ui.addBtn.clicked.connect(self.add_header)
        self.ui.removeBtn.clicked.connect(self.remove_header)
        self.ui.headersTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        
        # 创建事件过滤器实例
        self.event_filter = TableWidgetFilter(self.ui.headersTable)
        self.ui.headersTable.viewport().installEventFilter(self.event_filter)
        self.ui.clearBtn.clicked.connect(self.clear_result)
        self.ui.sendBtn.clicked.connect(self.send)

    def add_header(self):
        self.ui.headersTable.insertRow(self.ui.headersTable.rowCount())
    
    def remove_header(self):
        row = self.ui.headersTable.currentRow()
        if row >= 0:
            self.ui.headersTable.removeRow(row)
            self.ui.headersTable.setCurrentItem(None)
    
    def send(self):
        #获取多个数据源
        request_type = self.ui.requestBox.currentText()
        request_url = self.ui.urlEdit.text()
        request_headers = {}
        for i in range(self.ui.headersTable.rowCount()):
            if self.ui.headersTable.item(i, 0) == None or self.ui.headersTable.item(i, 1) == None:
                continue
            key = self.ui.headersTable.item(i, 0).text()
            value = self.ui.headersTable.item(i, 1).text()
            request_headers[key] = value
        
        request_body = self.ui.bodyEdit.toPlainText()
        try:
            req = requests.Request(request_type, 
                            request_url, 
                            headers=request_headers, 
                            data=request_body)      
            prepared = req.prepare()
        except requests.exceptions.RequestException as e:
            QMessageBox.warning(self.ui, "错误", "请求参数错误\n" + str(e))
            return

        self.ui.resultText.appendPlainText(pretty_print_request(prepared))
        #发送包
        try:
            res = requests.Session().send(prepared)
            self.ui.resultText.appendPlainText(pretty_print_response(res))
        except requests.exceptions.RequestException as e:
            QMessageBox.warning(self.ui, "错误", "请求失败\n" + str(e))
            return

    def clear_result(self):
        self.ui.resultText.clear()


app = QApplication([])
mainWindow = MainWindow()
mainWindow.ui.show()
app.exec()

动态加载的main.ui文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>534</width>
    <height>519</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>HTTP接口测试</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout_3">
   <item>
    <layout class="QVBoxLayout" name="verticalLayout_2">
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QComboBox" name="requestBox">
         <item>
          <property name="text">
           <string>GET</string>
          </property>
         </item>
         <item>
          <property name="text">
           <string>POST</string>
          </property>
         </item>
        </widget>
       </item>
       <item>
        <widget class="QLineEdit" name="urlEdit"/>
       </item>
       <item>
        <widget class="QPushButton" name="sendBtn">
         <property name="text">
          <string>发送</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="Line" name="line">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QSplitter" name="splitter_3">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
       <widget class="QSplitter" name="splitter_2">
        <property name="orientation">
         <enum>Qt::Vertical</enum>
        </property>
        <widget class="QSplitter" name="splitter">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
         <widget class="QLabel" name="label">
          <property name="font">
           <font>
            <pointsize>12</pointsize>
           </font>
          </property>
          <property name="layoutDirection">
           <enum>Qt::LeftToRight</enum>
          </property>
          <property name="text">
           <string>消息头</string>
          </property>
          <property name="alignment">
           <set>Qt::AlignCenter</set>
          </property>
         </widget>
         <widget class="QPushButton" name="addBtn">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="maximumSize">
           <size>
            <width>50</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>+</string>
          </property>
         </widget>
         <widget class="QPushButton" name="removeBtn">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="maximumSize">
           <size>
            <width>50</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>-</string>
          </property>
         </widget>
        </widget>
        <widget class="QTableWidget" name="headersTable">
         <column>
          <property name="text">
           <string>名称</string>
          </property>
         </column>
         <column>
          <property name="text">
           <string></string>
          </property>
         </column>
        </widget>
       </widget>
       <widget class="Line" name="line_2">
        <property name="minimumSize">
         <size>
          <width>15</width>
          <height>0</height>
         </size>
        </property>
        <property name="orientation">
         <enum>Qt::Vertical</enum>
        </property>
       </widget>
       <widget class="QWidget" name="layoutWidget_2">
        <layout class="QVBoxLayout" name="verticalLayout">
         <item>
          <widget class="QLabel" name="label_2">
           <property name="font">
            <font>
             <pointsize>12</pointsize>
            </font>
           </property>
           <property name="text">
            <string>消息体</string>
           </property>
           <property name="alignment">
            <set>Qt::AlignCenter</set>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QPlainTextEdit" name="bodyEdit">
           <property name="enabled">
            <bool>true</bool>
           </property>
          </widget>
         </item>
        </layout>
       </widget>
      </widget>
     </item>
     <item>
      <widget class="Line" name="line_3">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPlainTextEdit" name="resultText">
       <property name="readOnly">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item alignment="Qt::AlignHCenter">
      <widget class="QPushButton" name="clearBtn">
       <property name="maximumSize">
        <size>
         <width>75</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>清除</string>
       </property>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

使用效果:
请添加图片描述


原文地址:https://blog.csdn.net/m0_37662818/article/details/143785894

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!